{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应`tf.kears` 版本的03，在训练过程中加入更多的控制\n",
    "\n",
    "1. 训练中保存/保存最好的模型\n",
    "2. 早停 \n",
    "3. 训练过程可视化\n",
    "\n",
    "<font color=\"red\">注</font>: 使用 tensorboard 可视化需要安装 tensorflow (TensorBoard依赖于tensorflow库，可以任意安装tensorflow的gpu/cpu版本)\n",
    "\n",
    "```shell\n",
    "pip install tensorflow\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.778421Z",
     "start_time": "2025-03-05T13:34:39.773263Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)  #设备是cuda:0，即GPU，如果没有GPU则是cpu\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.9.1\n",
      "numpy 2.0.0\n",
      "pandas 2.2.2\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu126\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.850933Z",
     "start_time": "2025-03-05T13:34:39.816011Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "# fashion_mnist图像分类数据集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.856268Z",
     "start_time": "2025-03-05T13:34:39.850933Z"
    }
   },
   "cell_type": "code",
   "source": "type(train_ds)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 24
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.862870Z",
     "start_time": "2025-03-05T13:34:39.856268Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=64, shuffle=True) # batch_size=32越大，训练速度越快，但是内存占用也越大\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=64, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 25
  },
  {
   "cell_type": "code",
   "source": [
    "# 查看数据\n",
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break\n",
    "#查看val_loader\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.880920Z",
     "start_time": "2025-03-05T13:34:39.862870Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64])\n",
      "torch.Size([64, 1, 28, 28])\n",
      "torch.Size([64])\n"
     ]
    }
   ],
   "execution_count": 26
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.891804Z",
     "start_time": "2025-03-05T13:34:39.882921Z"
    }
   },
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(28 * 28, 300),  # in_features=784, out_features=300\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(300, 100),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(100, 10),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 28 * 28]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 27
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.934506Z",
     "start_time": "2025-03-05T13:34:39.894809Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        #datas.shape [batch size, 1, 28, 28]\n",
    "        #labels.shape [batch size]\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # tensor.item() 获取tensor的数值，loss是只有一个元素的tensor\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测, axis=-1 表示最后一个维度,因为logits.shape [batch size, 10]，所以axis=-1表示对最后一个维度求argmax，即对每个样本的10个类别的概率求argmax，得到最大概率的类别, preds.shape [batch size]\n",
    "        pred_list.extend(preds.cpu().numpy().tolist()) # tensor转numpy，再转list\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 验证集准确率\n",
    "    return np.mean(loss_list), acc # 返回验证集平均损失和准确率\n"
   ],
   "outputs": [],
   "execution_count": 28
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorBoard 可视化\n",
    "\n",
    "pip install tensorboard\n",
    "训练过程中可以使用如下命令启动tensorboard服务。注意使用绝对路径，否则会报错\n",
    "\n",
    "```shell\n",
    " tensorboard  --logdir=\"D:\\BaiduSyncdisk\\pytorch\\chapter_2_torch\\runs\" --host 0.0.0.0 --port 8848\n",
    "```"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "在命令行where tensorboard才可以用"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.956721Z",
     "start_time": "2025-03-05T13:34:39.935510Z"
    }
   },
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs) # 实例化SummaryWriter, log_dir是log存放路径，flush_secs是每隔多少秒写入磁盘\n",
    "\n",
    "    def draw_model(self, model, input_shape):#graphs\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape)) # 画模型图\n",
    "        \n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\", \n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            ) # 画loss曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "        \n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        ) # 画acc曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "        \n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "        ) # 画lr曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
    "    \n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss,把loss，val_loss取掉，画loss曲线\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss) # 画loss曲线\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc) # 画acc曲线\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate) # 画lr曲线\n"
   ],
   "outputs": [],
   "execution_count": 29
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Save Best\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.980680Z",
     "start_time": "2025-03-05T13:34:39.959238Z"
    }
   },
   "source": [
    "class SaveCheckpointsCallback:  # 保存最好的模型\n",
    "    def __init__(self, save_dir, save_step=500, save_best_only=True):   # True表示只保存最好的模型，False表示保存每个模型\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir # 保存路径\n",
    "        self.save_step = save_step # 保存步数\n",
    "        self.save_best_only = save_best_only # 是否只保存最好的模型\n",
    "        self.best_metrics = -1 # 最好的指标，指标不可能为负数，所以初始化为-1\n",
    "        \n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir): # 如果不存在保存路径，则创建\n",
    "            os.mkdir(self.save_dir)\n",
    "        \n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0: #每隔save_step步保存一次\n",
    "            return\n",
    "        \n",
    "        if self.save_best_only:\n",
    "            assert metric is not None,'metric is None' # 必须传入metric，抛断言异常异常\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\")) # 保存最好的模型，覆盖之前的模型，不保存step，只保存state_dict，即模型参数，不保存优化器参数\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\")) # 保存每个step的模型，不覆盖之前的模型，保存step，保存state_dict，即模型参数，不保存优化器参数\n",
    "\n"
   ],
   "outputs": [],
   "execution_count": 30
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Early Stop"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:39.994030Z",
     "start_time": "2025-03-05T13:34:39.981686Z"
    }
   },
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience # 多少个step没有提升就停止训练\n",
    "        self.min_delta = min_delta # 最小的提升幅度\n",
    "        self.best_metric = -1   # 初始化为-1，指标不可能为负数\n",
    "        self.counter = 0 # 计数器，记录多少个step没有提升\n",
    "        \n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:#用准确率\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else: \n",
    "            self.counter += 1 # 计数器加1，下面的patience判断用到\n",
    "            \n",
    "    @property #使用@property装饰器，使得 对象.early_stop可以调用，不需要()\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ],
   "outputs": [],
   "execution_count": 31
  },
  {
   "cell_type": "code",
   "source": [
    "500*32*5"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:40.009174Z",
     "start_time": "2025-03-05T13:34:39.996035Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "80000"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 32
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:40.019822Z",
     "start_time": "2025-03-05T13:34:40.010179Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device) # 数据放到device上\n",
    "                labels = labels.to(device) # 标签放到device上\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，计算梯度，更新参数，这里是更新模型参数\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits.argmax(axis=-1)\n",
    "            \n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()  # 切换到验证集模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 切换回训练集模式\n",
    "                    \n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step, \n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"], # 取出当前学习率\n",
    "                            )\n",
    "                    \n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc) # 保存最好的模型，覆盖之前的模型，保存step，保存state_dict,通过metric判断是否保存最好的模型\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc) # 验证集准确率不再提升，则停止训练\n",
    "                        if early_stop_callback.early_stop:# 验证集准确率不再提升，则停止训练\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "                    \n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict"
   ],
   "outputs": [],
   "execution_count": 33
  },
  {
   "cell_type": "code",
   "source": [
    "epoch = 100\n",
    "\n",
    "model = NeuralNetwork()\n",
    "\n",
    "# 1. 定义损失函数 采用MSE损失\n",
    "loss_fct = nn.CrossEntropyLoss()\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "tensorboard_callback = TensorBoardCallback(\"runs\")\n",
    "tensorboard_callback.draw_model(model, [1, 28, 28])\n",
    "# 2. save best\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints\", save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:40.137408Z",
     "start_time": "2025-03-05T13:34:40.021828Z"
    }
   },
   "outputs": [],
   "execution_count": 34
  },
  {
   "cell_type": "code",
   "source": [
    "list(model.parameters())[1] #可学习的模型参数"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:40.147951Z",
     "start_time": "2025-03-05T13:34:40.137913Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Parameter containing:\n",
       "tensor([ 2.5544e-02,  1.8685e-02,  3.2519e-03, -2.6188e-02, -2.6465e-02,\n",
       "        -2.5446e-02,  1.8946e-02,  2.8804e-03,  1.9190e-02,  2.9522e-02,\n",
       "         3.0919e-02, -1.7960e-02,  1.3406e-02, -1.1480e-02,  3.1068e-02,\n",
       "         1.8555e-02,  2.3415e-02, -4.7496e-04, -4.2145e-03,  3.4099e-02,\n",
       "        -1.1256e-02,  2.0139e-02,  1.8592e-02, -2.6677e-02,  2.5283e-02,\n",
       "         3.2856e-02, -1.5639e-03, -3.1580e-02,  1.3931e-02, -7.2875e-03,\n",
       "        -6.7601e-03, -2.3037e-02,  2.2946e-02,  2.4614e-02,  1.8197e-02,\n",
       "         1.9224e-02, -5.8651e-03, -1.5826e-03,  1.0518e-02,  3.1571e-02,\n",
       "         2.3385e-02, -7.7323e-03, -9.7727e-03, -1.5723e-02, -5.0186e-03,\n",
       "         2.5256e-02, -3.3190e-02, -3.2850e-02,  5.4499e-03, -8.1431e-03,\n",
       "        -3.5272e-02, -9.6855e-03, -9.6802e-03,  3.5567e-02,  2.1656e-02,\n",
       "         2.3381e-02,  1.6440e-03, -1.8938e-02, -1.7555e-02, -2.0515e-02,\n",
       "         3.1704e-02,  9.5283e-03, -1.1178e-02, -1.9424e-02,  2.6627e-02,\n",
       "         2.6131e-02,  3.3038e-02,  2.2551e-02,  2.8759e-02,  1.1629e-02,\n",
       "         3.0905e-02, -1.9336e-02,  2.5177e-02, -1.0938e-02,  2.6018e-02,\n",
       "        -1.6211e-02, -2.2333e-02,  3.4653e-02, -2.1340e-02, -6.2888e-03,\n",
       "        -1.3240e-03, -8.8299e-03, -2.3180e-02, -6.0078e-03,  6.6463e-03,\n",
       "        -1.7246e-02, -5.1482e-03,  1.5866e-02, -3.0700e-02,  1.7139e-02,\n",
       "        -1.9618e-02, -2.4454e-02,  2.9826e-02, -1.3665e-02, -1.3745e-02,\n",
       "        -3.0994e-02, -2.7024e-02, -3.9060e-03, -2.8488e-02, -4.0587e-03,\n",
       "         6.6209e-03,  2.5340e-02,  4.3043e-03, -3.3883e-02, -3.5026e-02,\n",
       "         2.9449e-02, -7.4827e-04, -2.2652e-02,  1.0698e-02, -3.0374e-03,\n",
       "        -6.6960e-03,  2.4549e-02,  1.0084e-02, -2.6544e-02, -2.0166e-02,\n",
       "         2.9985e-02,  1.9095e-02, -1.0385e-02, -2.3433e-02, -1.9074e-02,\n",
       "        -2.3179e-02,  2.4133e-02,  6.7420e-03,  9.7686e-03,  1.8061e-02,\n",
       "        -1.3125e-02, -1.9002e-03, -9.0701e-03,  1.8424e-02,  2.3870e-02,\n",
       "         1.8799e-02,  1.6797e-02,  1.1754e-02,  9.8894e-03,  2.0769e-02,\n",
       "         3.1330e-02, -2.9130e-02,  2.4714e-02,  6.9136e-03,  1.8549e-02,\n",
       "         2.6967e-02, -9.9531e-03, -2.8419e-03,  1.2130e-02,  2.5603e-02,\n",
       "         7.2186e-03, -1.4425e-03, -9.3612e-04,  2.4599e-02,  1.1231e-02,\n",
       "        -3.5446e-03,  1.5726e-02,  3.5468e-03,  1.0387e-02, -7.3078e-03,\n",
       "        -3.6091e-03,  3.5069e-02,  7.7412e-04,  1.2401e-02, -2.8228e-02,\n",
       "        -6.7020e-03, -1.8389e-02, -3.4750e-02,  2.6186e-02, -1.9558e-02,\n",
       "         1.1371e-02, -2.1596e-02, -1.9009e-02,  1.0547e-02,  3.3751e-02,\n",
       "        -2.5160e-02,  2.4680e-02,  5.2229e-03,  1.6112e-02,  2.9091e-02,\n",
       "         9.8305e-03,  2.5034e-02,  2.3926e-02, -3.3129e-02, -2.5924e-02,\n",
       "         4.3874e-03,  1.5420e-02, -3.0157e-02, -3.9453e-03,  2.4788e-03,\n",
       "         3.0521e-02,  3.0768e-02,  3.4242e-02,  2.4543e-02,  2.5188e-02,\n",
       "        -2.8708e-02, -1.7051e-02, -2.8982e-02,  1.8543e-02,  3.0148e-02,\n",
       "        -3.5082e-02,  1.3617e-02, -5.8459e-03, -1.5062e-02, -3.3016e-02,\n",
       "         6.0819e-03, -1.7998e-02, -2.9453e-02,  4.4922e-03,  3.2782e-02,\n",
       "         5.5282e-03, -6.4344e-03, -1.8417e-02, -2.8019e-02, -4.8943e-03,\n",
       "        -2.2704e-02, -2.4557e-02, -7.1875e-03, -9.9990e-03,  2.7796e-02,\n",
       "         2.7158e-02,  7.3009e-04,  5.9289e-03,  2.6114e-02, -1.7955e-02,\n",
       "        -2.8469e-02,  8.9040e-03,  3.7923e-03, -2.9575e-02,  1.4743e-02,\n",
       "        -4.9453e-03, -1.6883e-02,  1.9389e-03, -2.8160e-02, -1.6421e-02,\n",
       "        -3.0924e-02,  3.1606e-02,  3.3149e-02, -2.6049e-02, -1.1984e-02,\n",
       "         3.4431e-03, -1.1887e-02,  8.1371e-03,  1.2798e-02,  1.5480e-02,\n",
       "        -1.6452e-03, -2.4702e-02,  4.7099e-05,  2.0378e-02,  2.3750e-02,\n",
       "         2.9005e-02,  1.3976e-02,  1.6520e-02, -2.2472e-02, -6.4938e-04,\n",
       "        -1.0951e-02, -1.0518e-02,  2.0414e-02, -2.3506e-02, -7.8811e-03,\n",
       "         1.3931e-02, -3.1017e-02,  2.5453e-02, -1.1688e-02,  2.8811e-02,\n",
       "         2.8483e-02, -2.4003e-03,  2.1297e-02, -1.4353e-02, -1.0790e-02,\n",
       "        -3.4113e-02,  2.4024e-02,  2.1211e-02, -3.4064e-03, -2.1069e-03,\n",
       "         1.9279e-02, -3.3826e-02,  1.1482e-02,  2.0025e-02,  3.5418e-02,\n",
       "        -5.1735e-03,  3.3933e-02,  1.7641e-02,  1.4479e-02,  2.5025e-02,\n",
       "        -2.0403e-02,  2.3785e-02, -3.5611e-02,  1.2805e-02,  9.8891e-03,\n",
       "        -1.0481e-02, -3.6800e-04, -9.7890e-03,  2.8608e-02, -3.1320e-02,\n",
       "        -2.1074e-03,  3.3958e-02, -1.3981e-02,  3.5153e-02,  1.8979e-02,\n",
       "         1.1073e-02,  2.7689e-02, -1.6822e-02, -2.1357e-04,  1.2683e-03],\n",
       "       requires_grad=True)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 35
  },
  {
   "cell_type": "code",
   "source": "model.state_dict().keys() #模型参数名字",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:34:40.158320Z",
     "start_time": "2025-03-05T13:34:40.149956Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "odict_keys(['linear_relu_stack.0.weight', 'linear_relu_stack.0.bias', 'linear_relu_stack.2.weight', 'linear_relu_stack.2.bias', 'linear_relu_stack.4.weight', 'linear_relu_stack.4.bias'])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "cell_type": "code",
   "source": [
    "model = model.to(device) # 放到device上\n",
    "record = training(\n",
    "    model,\n",
    "    train_loader,\n",
    "    val_loader,\n",
    "    epoch,\n",
    "    loss_fct,\n",
    "    optimizer,\n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=1000\n",
    "    )\n",
    "#没有进度条，是因为pycharm本身jupyter的问题"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:41:36.928374Z",
     "start_time": "2025-03-05T13:34:40.158320Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/93800 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "9bf5df68e46b4038b2e1b06819c54aa8"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 39 / global_step 37000\n"
     ]
    }
   ],
   "execution_count": 37
  },
  {
   "cell_type": "code",
   "source": [
    "#帮我写个enumerate例子\n",
    "for i, item in enumerate([\"a\", \"b\", \"c\"]):\n",
    "    print(i, item)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:41:36.932325Z",
     "start_time": "2025-03-05T13:41:36.929362Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 a\n",
      "1 b\n",
      "2 c\n"
     ]
    }
   ],
   "execution_count": 38
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:41:37.010357Z",
     "start_time": "2025-03-05T13:41:36.933333Z"
    }
   },
   "cell_type": "code",
   "source": "record",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'train': [{'loss': 2.3080971240997314, 'acc': 0.078125, 'step': 0},\n",
       "  {'loss': 2.3050949573516846, 'acc': 0.046875, 'step': 1},\n",
       "  {'loss': 2.3068864345550537, 'acc': 0.109375, 'step': 2},\n",
       "  {'loss': 2.301436185836792, 'acc': 0.046875, 'step': 3},\n",
       "  {'loss': 2.2962496280670166, 'acc': 0.09375, 'step': 4},\n",
       "  {'loss': 2.3161351680755615, 'acc': 0.0625, 'step': 5},\n",
       "  {'loss': 2.3060221672058105, 'acc': 0.078125, 'step': 6},\n",
       "  {'loss': 2.2833433151245117, 'acc': 0.125, 'step': 7},\n",
       "  {'loss': 2.2917420864105225, 'acc': 0.125, 'step': 8},\n",
       "  {'loss': 2.2999677658081055, 'acc': 0.109375, 'step': 9},\n",
       "  {'loss': 2.2900335788726807, 'acc': 0.125, 'step': 10},\n",
       "  {'loss': 2.2897849082946777, 'acc': 0.078125, 'step': 11},\n",
       "  {'loss': 2.3004262447357178, 'acc': 0.0625, 'step': 12},\n",
       "  {'loss': 2.2937464714050293, 'acc': 0.046875, 'step': 13},\n",
       "  {'loss': 2.2978217601776123, 'acc': 0.09375, 'step': 14},\n",
       "  {'loss': 2.2809109687805176, 'acc': 0.171875, 'step': 15},\n",
       "  {'loss': 2.289874315261841, 'acc': 0.125, 'step': 16},\n",
       "  {'loss': 2.301713705062866, 'acc': 0.09375, 'step': 17},\n",
       "  {'loss': 2.289208173751831, 'acc': 0.140625, 'step': 18},\n",
       "  {'loss': 2.3093926906585693, 'acc': 0.15625, 'step': 19},\n",
       "  {'loss': 2.3043906688690186, 'acc': 0.140625, 'step': 20},\n",
       "  {'loss': 2.290468454360962, 'acc': 0.125, 'step': 21},\n",
       "  {'loss': 2.2832417488098145, 'acc': 0.25, 'step': 22},\n",
       "  {'loss': 2.2771949768066406, 'acc': 0.21875, 'step': 23},\n",
       "  {'loss': 2.2877323627471924, 'acc': 0.25, 'step': 24},\n",
       "  {'loss': 2.272240400314331, 'acc': 0.234375, 'step': 25},\n",
       "  {'loss': 2.275477170944214, 'acc': 0.34375, 'step': 26},\n",
       "  {'loss': 2.301419258117676, 'acc': 0.171875, 'step': 27},\n",
       "  {'loss': 2.2795679569244385, 'acc': 0.21875, 'step': 28},\n",
       "  {'loss': 2.288320779800415, 'acc': 0.171875, 'step': 29},\n",
       "  {'loss': 2.268453359603882, 'acc': 0.203125, 'step': 30},\n",
       "  {'loss': 2.2823853492736816, 'acc': 0.25, 'step': 31},\n",
       "  {'loss': 2.275642156600952, 'acc': 0.1875, 'step': 32},\n",
       "  {'loss': 2.295666217803955, 'acc': 0.171875, 'step': 33},\n",
       "  {'loss': 2.2836995124816895, 'acc': 0.203125, 'step': 34},\n",
       "  {'loss': 2.272010564804077, 'acc': 0.375, 'step': 35},\n",
       "  {'loss': 2.2621278762817383, 'acc': 0.296875, 'step': 36},\n",
       "  {'loss': 2.2841110229492188, 'acc': 0.1875, 'step': 37},\n",
       "  {'loss': 2.2901270389556885, 'acc': 0.171875, 'step': 38},\n",
       "  {'loss': 2.2731616497039795, 'acc': 0.1875, 'step': 39},\n",
       "  {'loss': 2.2568745613098145, 'acc': 0.28125, 'step': 40},\n",
       "  {'loss': 2.2519032955169678, 'acc': 0.328125, 'step': 41},\n",
       "  {'loss': 2.263357162475586, 'acc': 0.296875, 'step': 42},\n",
       "  {'loss': 2.280890703201294, 'acc': 0.234375, 'step': 43},\n",
       "  {'loss': 2.2669458389282227, 'acc': 0.25, 'step': 44},\n",
       "  {'loss': 2.2544078826904297, 'acc': 0.34375, 'step': 45},\n",
       "  {'loss': 2.2862021923065186, 'acc': 0.234375, 'step': 46},\n",
       "  {'loss': 2.2726640701293945, 'acc': 0.109375, 'step': 47},\n",
       "  {'loss': 2.266472816467285, 'acc': 0.21875, 'step': 48},\n",
       "  {'loss': 2.2739925384521484, 'acc': 0.3125, 'step': 49},\n",
       "  {'loss': 2.2472968101501465, 'acc': 0.359375, 'step': 50},\n",
       "  {'loss': 2.275299072265625, 'acc': 0.1875, 'step': 51},\n",
       "  {'loss': 2.2543928623199463, 'acc': 0.328125, 'step': 52},\n",
       "  {'loss': 2.2664637565612793, 'acc': 0.25, 'step': 53},\n",
       "  {'loss': 2.2484939098358154, 'acc': 0.375, 'step': 54},\n",
       "  {'loss': 2.253822088241577, 'acc': 0.25, 'step': 55},\n",
       "  {'loss': 2.259389877319336, 'acc': 0.1875, 'step': 56},\n",
       "  {'loss': 2.2513375282287598, 'acc': 0.3125, 'step': 57},\n",
       "  {'loss': 2.274611234664917, 'acc': 0.15625, 'step': 58},\n",
       "  {'loss': 2.255533456802368, 'acc': 0.34375, 'step': 59},\n",
       "  {'loss': 2.251235008239746, 'acc': 0.25, 'step': 60},\n",
       "  {'loss': 2.264587879180908, 'acc': 0.21875, 'step': 61},\n",
       "  {'loss': 2.2463741302490234, 'acc': 0.3125, 'step': 62},\n",
       "  {'loss': 2.2450568675994873, 'acc': 0.296875, 'step': 63},\n",
       "  {'loss': 2.2472970485687256, 'acc': 0.296875, 'step': 64},\n",
       "  {'loss': 2.242574453353882, 'acc': 0.34375, 'step': 65},\n",
       "  {'loss': 2.2500553131103516, 'acc': 0.21875, 'step': 66},\n",
       "  {'loss': 2.248516321182251, 'acc': 0.296875, 'step': 67},\n",
       "  {'loss': 2.261699676513672, 'acc': 0.328125, 'step': 68},\n",
       "  {'loss': 2.2485036849975586, 'acc': 0.28125, 'step': 69},\n",
       "  {'loss': 2.23962664604187, 'acc': 0.390625, 'step': 70},\n",
       "  {'loss': 2.2384588718414307, 'acc': 0.28125, 'step': 71},\n",
       "  {'loss': 2.2412400245666504, 'acc': 0.328125, 'step': 72},\n",
       "  {'loss': 2.2327914237976074, 'acc': 0.28125, 'step': 73},\n",
       "  {'loss': 2.21511173248291, 'acc': 0.4375, 'step': 74},\n",
       "  {'loss': 2.2358551025390625, 'acc': 0.21875, 'step': 75},\n",
       "  {'loss': 2.2141292095184326, 'acc': 0.453125, 'step': 76},\n",
       "  {'loss': 2.2323386669158936, 'acc': 0.25, 'step': 77},\n",
       "  {'loss': 2.240976572036743, 'acc': 0.3125, 'step': 78},\n",
       "  {'loss': 2.212351083755493, 'acc': 0.296875, 'step': 79},\n",
       "  {'loss': 2.228732109069824, 'acc': 0.328125, 'step': 80},\n",
       "  {'loss': 2.2411081790924072, 'acc': 0.21875, 'step': 81},\n",
       "  {'loss': 2.2177999019622803, 'acc': 0.34375, 'step': 82},\n",
       "  {'loss': 2.238079786300659, 'acc': 0.25, 'step': 83},\n",
       "  {'loss': 2.193586587905884, 'acc': 0.421875, 'step': 84},\n",
       "  {'loss': 2.2160050868988037, 'acc': 0.375, 'step': 85},\n",
       "  {'loss': 2.214482069015503, 'acc': 0.375, 'step': 86},\n",
       "  {'loss': 2.232306480407715, 'acc': 0.203125, 'step': 87},\n",
       "  {'loss': 2.231895685195923, 'acc': 0.3125, 'step': 88},\n",
       "  {'loss': 2.2234230041503906, 'acc': 0.375, 'step': 89},\n",
       "  {'loss': 2.204853057861328, 'acc': 0.296875, 'step': 90},\n",
       "  {'loss': 2.2140955924987793, 'acc': 0.234375, 'step': 91},\n",
       "  {'loss': 2.229806661605835, 'acc': 0.375, 'step': 92},\n",
       "  {'loss': 2.2245168685913086, 'acc': 0.25, 'step': 93},\n",
       "  {'loss': 2.204824447631836, 'acc': 0.3125, 'step': 94},\n",
       "  {'loss': 2.193683385848999, 'acc': 0.25, 'step': 95},\n",
       "  {'loss': 2.2224173545837402, 'acc': 0.28125, 'step': 96},\n",
       "  {'loss': 2.196528434753418, 'acc': 0.359375, 'step': 97},\n",
       "  {'loss': 2.213887929916382, 'acc': 0.375, 'step': 98},\n",
       "  {'loss': 2.2088401317596436, 'acc': 0.34375, 'step': 99},\n",
       "  {'loss': 2.204178810119629, 'acc': 0.296875, 'step': 100},\n",
       "  {'loss': 2.223332405090332, 'acc': 0.234375, 'step': 101},\n",
       "  {'loss': 2.210937023162842, 'acc': 0.328125, 'step': 102},\n",
       "  {'loss': 2.18188738822937, 'acc': 0.390625, 'step': 103},\n",
       "  {'loss': 2.201230525970459, 'acc': 0.328125, 'step': 104},\n",
       "  {'loss': 2.2172739505767822, 'acc': 0.234375, 'step': 105},\n",
       "  {'loss': 2.1999988555908203, 'acc': 0.3125, 'step': 106},\n",
       "  {'loss': 2.2144386768341064, 'acc': 0.296875, 'step': 107},\n",
       "  {'loss': 2.200390338897705, 'acc': 0.28125, 'step': 108},\n",
       "  {'loss': 2.210405111312866, 'acc': 0.3125, 'step': 109},\n",
       "  {'loss': 2.2014784812927246, 'acc': 0.328125, 'step': 110},\n",
       "  {'loss': 2.1958532333374023, 'acc': 0.28125, 'step': 111},\n",
       "  {'loss': 2.174746036529541, 'acc': 0.34375, 'step': 112},\n",
       "  {'loss': 2.1618216037750244, 'acc': 0.5, 'step': 113},\n",
       "  {'loss': 2.1881308555603027, 'acc': 0.296875, 'step': 114},\n",
       "  {'loss': 2.1870663166046143, 'acc': 0.390625, 'step': 115},\n",
       "  {'loss': 2.1800336837768555, 'acc': 0.328125, 'step': 116},\n",
       "  {'loss': 2.197847604751587, 'acc': 0.375, 'step': 117},\n",
       "  {'loss': 2.2153406143188477, 'acc': 0.296875, 'step': 118},\n",
       "  {'loss': 2.1708755493164062, 'acc': 0.421875, 'step': 119},\n",
       "  {'loss': 2.206982374191284, 'acc': 0.40625, 'step': 120},\n",
       "  {'loss': 2.154428005218506, 'acc': 0.375, 'step': 121},\n",
       "  {'loss': 2.1949567794799805, 'acc': 0.28125, 'step': 122},\n",
       "  {'loss': 2.1909339427948, 'acc': 0.328125, 'step': 123},\n",
       "  {'loss': 2.187818765640259, 'acc': 0.265625, 'step': 124},\n",
       "  {'loss': 2.15129017829895, 'acc': 0.375, 'step': 125},\n",
       "  {'loss': 2.172405958175659, 'acc': 0.296875, 'step': 126},\n",
       "  {'loss': 2.1491568088531494, 'acc': 0.453125, 'step': 127},\n",
       "  {'loss': 2.1464614868164062, 'acc': 0.453125, 'step': 128},\n",
       "  {'loss': 2.1712265014648438, 'acc': 0.390625, 'step': 129},\n",
       "  {'loss': 2.1747450828552246, 'acc': 0.234375, 'step': 130},\n",
       "  {'loss': 2.140556812286377, 'acc': 0.53125, 'step': 131},\n",
       "  {'loss': 2.180751323699951, 'acc': 0.328125, 'step': 132},\n",
       "  {'loss': 2.146120548248291, 'acc': 0.40625, 'step': 133},\n",
       "  {'loss': 2.1859679222106934, 'acc': 0.3125, 'step': 134},\n",
       "  {'loss': 2.1438446044921875, 'acc': 0.328125, 'step': 135},\n",
       "  {'loss': 2.1490373611450195, 'acc': 0.40625, 'step': 136},\n",
       "  {'loss': 2.1587963104248047, 'acc': 0.375, 'step': 137},\n",
       "  {'loss': 2.1485660076141357, 'acc': 0.40625, 'step': 138},\n",
       "  {'loss': 2.1667306423187256, 'acc': 0.5, 'step': 139},\n",
       "  {'loss': 2.1820480823516846, 'acc': 0.390625, 'step': 140},\n",
       "  {'loss': 2.141226291656494, 'acc': 0.421875, 'step': 141},\n",
       "  {'loss': 2.119478702545166, 'acc': 0.4375, 'step': 142},\n",
       "  {'loss': 2.1502275466918945, 'acc': 0.4375, 'step': 143},\n",
       "  {'loss': 2.102048635482788, 'acc': 0.59375, 'step': 144},\n",
       "  {'loss': 2.1515824794769287, 'acc': 0.453125, 'step': 145},\n",
       "  {'loss': 2.126603364944458, 'acc': 0.40625, 'step': 146},\n",
       "  {'loss': 2.126227855682373, 'acc': 0.453125, 'step': 147},\n",
       "  {'loss': 2.1447229385375977, 'acc': 0.390625, 'step': 148},\n",
       "  {'loss': 2.147919178009033, 'acc': 0.359375, 'step': 149},\n",
       "  {'loss': 2.127842903137207, 'acc': 0.359375, 'step': 150},\n",
       "  {'loss': 2.1238467693328857, 'acc': 0.390625, 'step': 151},\n",
       "  {'loss': 2.130631446838379, 'acc': 0.40625, 'step': 152},\n",
       "  {'loss': 2.1183128356933594, 'acc': 0.4375, 'step': 153},\n",
       "  {'loss': 2.1208226680755615, 'acc': 0.40625, 'step': 154},\n",
       "  {'loss': 2.110269784927368, 'acc': 0.53125, 'step': 155},\n",
       "  {'loss': 2.1449337005615234, 'acc': 0.390625, 'step': 156},\n",
       "  {'loss': 2.1278908252716064, 'acc': 0.5, 'step': 157},\n",
       "  {'loss': 2.103001832962036, 'acc': 0.4375, 'step': 158},\n",
       "  {'loss': 2.132065773010254, 'acc': 0.46875, 'step': 159},\n",
       "  {'loss': 2.098907947540283, 'acc': 0.46875, 'step': 160},\n",
       "  {'loss': 2.1137447357177734, 'acc': 0.46875, 'step': 161},\n",
       "  {'loss': 2.0982327461242676, 'acc': 0.5, 'step': 162},\n",
       "  {'loss': 2.0870578289031982, 'acc': 0.46875, 'step': 163},\n",
       "  {'loss': 2.091974973678589, 'acc': 0.59375, 'step': 164},\n",
       "  {'loss': 2.1004910469055176, 'acc': 0.5625, 'step': 165},\n",
       "  {'loss': 2.0953269004821777, 'acc': 0.5625, 'step': 166},\n",
       "  {'loss': 2.100137233734131, 'acc': 0.484375, 'step': 167},\n",
       "  {'loss': 2.1130969524383545, 'acc': 0.484375, 'step': 168},\n",
       "  {'loss': 2.084653615951538, 'acc': 0.546875, 'step': 169},\n",
       "  {'loss': 2.1051385402679443, 'acc': 0.453125, 'step': 170},\n",
       "  {'loss': 2.103581666946411, 'acc': 0.5, 'step': 171},\n",
       "  {'loss': 2.0844664573669434, 'acc': 0.4375, 'step': 172},\n",
       "  {'loss': 2.0796616077423096, 'acc': 0.578125, 'step': 173},\n",
       "  {'loss': 2.0399069786071777, 'acc': 0.65625, 'step': 174},\n",
       "  {'loss': 2.075547218322754, 'acc': 0.4375, 'step': 175},\n",
       "  {'loss': 2.0827317237854004, 'acc': 0.4375, 'step': 176},\n",
       "  {'loss': 2.0466675758361816, 'acc': 0.515625, 'step': 177},\n",
       "  {'loss': 2.0868241786956787, 'acc': 0.546875, 'step': 178},\n",
       "  {'loss': 2.0516533851623535, 'acc': 0.484375, 'step': 179},\n",
       "  {'loss': 2.0638391971588135, 'acc': 0.484375, 'step': 180},\n",
       "  {'loss': 2.074589490890503, 'acc': 0.484375, 'step': 181},\n",
       "  {'loss': 2.0590333938598633, 'acc': 0.53125, 'step': 182},\n",
       "  {'loss': 2.0827817916870117, 'acc': 0.453125, 'step': 183},\n",
       "  {'loss': 2.085385799407959, 'acc': 0.515625, 'step': 184},\n",
       "  {'loss': 2.073376178741455, 'acc': 0.46875, 'step': 185},\n",
       "  {'loss': 2.0778989791870117, 'acc': 0.453125, 'step': 186},\n",
       "  {'loss': 2.0447235107421875, 'acc': 0.53125, 'step': 187},\n",
       "  {'loss': 2.075899839401245, 'acc': 0.46875, 'step': 188},\n",
       "  {'loss': 2.04616379737854, 'acc': 0.578125, 'step': 189},\n",
       "  {'loss': 2.0695624351501465, 'acc': 0.546875, 'step': 190},\n",
       "  {'loss': 2.064361572265625, 'acc': 0.40625, 'step': 191},\n",
       "  {'loss': 2.040869951248169, 'acc': 0.53125, 'step': 192},\n",
       "  {'loss': 2.019233226776123, 'acc': 0.59375, 'step': 193},\n",
       "  {'loss': 2.070726156234741, 'acc': 0.40625, 'step': 194},\n",
       "  {'loss': 2.0490665435791016, 'acc': 0.359375, 'step': 195},\n",
       "  {'loss': 2.005201816558838, 'acc': 0.59375, 'step': 196},\n",
       "  {'loss': 2.0028162002563477, 'acc': 0.640625, 'step': 197},\n",
       "  {'loss': 2.058739423751831, 'acc': 0.546875, 'step': 198},\n",
       "  {'loss': 2.005254030227661, 'acc': 0.703125, 'step': 199},\n",
       "  {'loss': 2.0140697956085205, 'acc': 0.59375, 'step': 200},\n",
       "  {'loss': 2.067155361175537, 'acc': 0.5, 'step': 201},\n",
       "  {'loss': 2.008589506149292, 'acc': 0.5625, 'step': 202},\n",
       "  {'loss': 2.0249555110931396, 'acc': 0.53125, 'step': 203},\n",
       "  {'loss': 2.024951696395874, 'acc': 0.546875, 'step': 204},\n",
       "  {'loss': 1.9986991882324219, 'acc': 0.5, 'step': 205},\n",
       "  {'loss': 2.0086350440979004, 'acc': 0.46875, 'step': 206},\n",
       "  {'loss': 1.982938289642334, 'acc': 0.578125, 'step': 207},\n",
       "  {'loss': 2.0393035411834717, 'acc': 0.4375, 'step': 208},\n",
       "  {'loss': 2.017296314239502, 'acc': 0.46875, 'step': 209},\n",
       "  {'loss': 1.968248724937439, 'acc': 0.46875, 'step': 210},\n",
       "  {'loss': 2.0371508598327637, 'acc': 0.453125, 'step': 211},\n",
       "  {'loss': 1.9621394872665405, 'acc': 0.53125, 'step': 212},\n",
       "  {'loss': 1.987922191619873, 'acc': 0.46875, 'step': 213},\n",
       "  {'loss': 2.0296578407287598, 'acc': 0.28125, 'step': 214},\n",
       "  {'loss': 1.9648436307907104, 'acc': 0.578125, 'step': 215},\n",
       "  {'loss': 1.9626826047897339, 'acc': 0.625, 'step': 216},\n",
       "  {'loss': 1.991010069847107, 'acc': 0.46875, 'step': 217},\n",
       "  {'loss': 1.968630313873291, 'acc': 0.5, 'step': 218},\n",
       "  {'loss': 2.0011584758758545, 'acc': 0.515625, 'step': 219},\n",
       "  {'loss': 1.9442338943481445, 'acc': 0.515625, 'step': 220},\n",
       "  {'loss': 1.9593675136566162, 'acc': 0.578125, 'step': 221},\n",
       "  {'loss': 2.0105538368225098, 'acc': 0.421875, 'step': 222},\n",
       "  {'loss': 1.9686859846115112, 'acc': 0.46875, 'step': 223},\n",
       "  {'loss': 1.9491055011749268, 'acc': 0.46875, 'step': 224},\n",
       "  {'loss': 1.992843747138977, 'acc': 0.453125, 'step': 225},\n",
       "  {'loss': 1.9771852493286133, 'acc': 0.390625, 'step': 226},\n",
       "  {'loss': 1.9660351276397705, 'acc': 0.484375, 'step': 227},\n",
       "  {'loss': 1.940522313117981, 'acc': 0.53125, 'step': 228},\n",
       "  {'loss': 1.9216649532318115, 'acc': 0.65625, 'step': 229},\n",
       "  {'loss': 1.891364574432373, 'acc': 0.46875, 'step': 230},\n",
       "  {'loss': 1.8834222555160522, 'acc': 0.5625, 'step': 231},\n",
       "  {'loss': 1.9304563999176025, 'acc': 0.515625, 'step': 232},\n",
       "  {'loss': 1.9252461194992065, 'acc': 0.484375, 'step': 233},\n",
       "  {'loss': 1.9168720245361328, 'acc': 0.53125, 'step': 234},\n",
       "  {'loss': 1.9531291723251343, 'acc': 0.46875, 'step': 235},\n",
       "  {'loss': 1.9197686910629272, 'acc': 0.609375, 'step': 236},\n",
       "  {'loss': 1.9406548738479614, 'acc': 0.5625, 'step': 237},\n",
       "  {'loss': 1.920704960823059, 'acc': 0.546875, 'step': 238},\n",
       "  {'loss': 1.955810785293579, 'acc': 0.59375, 'step': 239},\n",
       "  {'loss': 1.9236140251159668, 'acc': 0.5, 'step': 240},\n",
       "  {'loss': 1.948293924331665, 'acc': 0.609375, 'step': 241},\n",
       "  {'loss': 1.8767493963241577, 'acc': 0.65625, 'step': 242},\n",
       "  {'loss': 1.9173308610916138, 'acc': 0.609375, 'step': 243},\n",
       "  {'loss': 1.9348043203353882, 'acc': 0.53125, 'step': 244},\n",
       "  {'loss': 1.8554737567901611, 'acc': 0.671875, 'step': 245},\n",
       "  {'loss': 1.8018624782562256, 'acc': 0.734375, 'step': 246},\n",
       "  {'loss': 1.8853116035461426, 'acc': 0.625, 'step': 247},\n",
       "  {'loss': 1.9222618341445923, 'acc': 0.46875, 'step': 248},\n",
       "  {'loss': 1.9174236059188843, 'acc': 0.609375, 'step': 249},\n",
       "  {'loss': 1.8165799379348755, 'acc': 0.65625, 'step': 250},\n",
       "  {'loss': 1.8954801559448242, 'acc': 0.59375, 'step': 251},\n",
       "  {'loss': 1.8944077491760254, 'acc': 0.5625, 'step': 252},\n",
       "  {'loss': 1.8466161489486694, 'acc': 0.65625, 'step': 253},\n",
       "  {'loss': 1.8219794034957886, 'acc': 0.6875, 'step': 254},\n",
       "  {'loss': 1.8140487670898438, 'acc': 0.625, 'step': 255},\n",
       "  {'loss': 1.843202829360962, 'acc': 0.609375, 'step': 256},\n",
       "  {'loss': 1.8009464740753174, 'acc': 0.65625, 'step': 257},\n",
       "  {'loss': 1.8439980745315552, 'acc': 0.59375, 'step': 258},\n",
       "  {'loss': 1.9040240049362183, 'acc': 0.53125, 'step': 259},\n",
       "  {'loss': 1.8752611875534058, 'acc': 0.4375, 'step': 260},\n",
       "  {'loss': 1.8453822135925293, 'acc': 0.5625, 'step': 261},\n",
       "  {'loss': 1.8326435089111328, 'acc': 0.59375, 'step': 262},\n",
       "  {'loss': 1.8143622875213623, 'acc': 0.609375, 'step': 263},\n",
       "  {'loss': 1.8234530687332153, 'acc': 0.609375, 'step': 264},\n",
       "  {'loss': 1.798048734664917, 'acc': 0.625, 'step': 265},\n",
       "  {'loss': 1.840254545211792, 'acc': 0.5625, 'step': 266},\n",
       "  {'loss': 1.803159236907959, 'acc': 0.484375, 'step': 267},\n",
       "  {'loss': 1.812686562538147, 'acc': 0.671875, 'step': 268},\n",
       "  {'loss': 1.7835620641708374, 'acc': 0.53125, 'step': 269},\n",
       "  {'loss': 1.7663191556930542, 'acc': 0.671875, 'step': 270},\n",
       "  {'loss': 1.8169734477996826, 'acc': 0.59375, 'step': 271},\n",
       "  {'loss': 1.8177449703216553, 'acc': 0.515625, 'step': 272},\n",
       "  {'loss': 1.7864015102386475, 'acc': 0.625, 'step': 273},\n",
       "  {'loss': 1.7765530347824097, 'acc': 0.59375, 'step': 274},\n",
       "  {'loss': 1.79371178150177, 'acc': 0.59375, 'step': 275},\n",
       "  {'loss': 1.8335777521133423, 'acc': 0.515625, 'step': 276},\n",
       "  {'loss': 1.7180973291397095, 'acc': 0.671875, 'step': 277},\n",
       "  {'loss': 1.7969400882720947, 'acc': 0.578125, 'step': 278},\n",
       "  {'loss': 1.8086912631988525, 'acc': 0.578125, 'step': 279},\n",
       "  {'loss': 1.8266934156417847, 'acc': 0.5625, 'step': 280},\n",
       "  {'loss': 1.7013508081436157, 'acc': 0.703125, 'step': 281},\n",
       "  {'loss': 1.7164143323898315, 'acc': 0.59375, 'step': 282},\n",
       "  {'loss': 1.6660288572311401, 'acc': 0.59375, 'step': 283},\n",
       "  {'loss': 1.7298352718353271, 'acc': 0.671875, 'step': 284},\n",
       "  {'loss': 1.6893703937530518, 'acc': 0.71875, 'step': 285},\n",
       "  {'loss': 1.7363916635513306, 'acc': 0.640625, 'step': 286},\n",
       "  {'loss': 1.7565765380859375, 'acc': 0.59375, 'step': 287},\n",
       "  {'loss': 1.7743093967437744, 'acc': 0.625, 'step': 288},\n",
       "  {'loss': 1.8070472478866577, 'acc': 0.46875, 'step': 289},\n",
       "  {'loss': 1.7657088041305542, 'acc': 0.578125, 'step': 290},\n",
       "  {'loss': 1.6250189542770386, 'acc': 0.703125, 'step': 291},\n",
       "  {'loss': 1.6656520366668701, 'acc': 0.765625, 'step': 292},\n",
       "  {'loss': 1.7554335594177246, 'acc': 0.578125, 'step': 293},\n",
       "  {'loss': 1.747113585472107, 'acc': 0.515625, 'step': 294},\n",
       "  {'loss': 1.7438149452209473, 'acc': 0.515625, 'step': 295},\n",
       "  {'loss': 1.7630738019943237, 'acc': 0.53125, 'step': 296},\n",
       "  {'loss': 1.8049030303955078, 'acc': 0.59375, 'step': 297},\n",
       "  {'loss': 1.771889328956604, 'acc': 0.53125, 'step': 298},\n",
       "  {'loss': 1.6789538860321045, 'acc': 0.59375, 'step': 299},\n",
       "  {'loss': 1.6504384279251099, 'acc': 0.6875, 'step': 300},\n",
       "  {'loss': 1.6397321224212646, 'acc': 0.625, 'step': 301},\n",
       "  {'loss': 1.7671022415161133, 'acc': 0.5625, 'step': 302},\n",
       "  {'loss': 1.674851655960083, 'acc': 0.59375, 'step': 303},\n",
       "  {'loss': 1.6802476644515991, 'acc': 0.609375, 'step': 304},\n",
       "  {'loss': 1.6649456024169922, 'acc': 0.640625, 'step': 305},\n",
       "  {'loss': 1.6609611511230469, 'acc': 0.640625, 'step': 306},\n",
       "  {'loss': 1.7056094408035278, 'acc': 0.671875, 'step': 307},\n",
       "  {'loss': 1.629253625869751, 'acc': 0.625, 'step': 308},\n",
       "  {'loss': 1.6894972324371338, 'acc': 0.625, 'step': 309},\n",
       "  {'loss': 1.7805771827697754, 'acc': 0.5625, 'step': 310},\n",
       "  {'loss': 1.6923434734344482, 'acc': 0.59375, 'step': 311},\n",
       "  {'loss': 1.6667892932891846, 'acc': 0.578125, 'step': 312},\n",
       "  {'loss': 1.616428017616272, 'acc': 0.625, 'step': 313},\n",
       "  {'loss': 1.64474356174469, 'acc': 0.484375, 'step': 314},\n",
       "  {'loss': 1.6948524713516235, 'acc': 0.59375, 'step': 315},\n",
       "  {'loss': 1.652927041053772, 'acc': 0.578125, 'step': 316},\n",
       "  {'loss': 1.5765972137451172, 'acc': 0.65625, 'step': 317},\n",
       "  {'loss': 1.695822834968567, 'acc': 0.515625, 'step': 318},\n",
       "  {'loss': 1.6512739658355713, 'acc': 0.53125, 'step': 319},\n",
       "  {'loss': 1.6125264167785645, 'acc': 0.625, 'step': 320},\n",
       "  {'loss': 1.6437022686004639, 'acc': 0.5625, 'step': 321},\n",
       "  {'loss': 1.6933289766311646, 'acc': 0.5, 'step': 322},\n",
       "  {'loss': 1.5710235834121704, 'acc': 0.6875, 'step': 323},\n",
       "  {'loss': 1.6968679428100586, 'acc': 0.515625, 'step': 324},\n",
       "  {'loss': 1.658901333808899, 'acc': 0.578125, 'step': 325},\n",
       "  {'loss': 1.6461392641067505, 'acc': 0.65625, 'step': 326},\n",
       "  {'loss': 1.6880840063095093, 'acc': 0.53125, 'step': 327},\n",
       "  {'loss': 1.5251893997192383, 'acc': 0.734375, 'step': 328},\n",
       "  {'loss': 1.6201870441436768, 'acc': 0.625, 'step': 329},\n",
       "  {'loss': 1.5806007385253906, 'acc': 0.6875, 'step': 330},\n",
       "  {'loss': 1.5027650594711304, 'acc': 0.6875, 'step': 331},\n",
       "  {'loss': 1.6236522197723389, 'acc': 0.625, 'step': 332},\n",
       "  {'loss': 1.5488831996917725, 'acc': 0.640625, 'step': 333},\n",
       "  {'loss': 1.5724968910217285, 'acc': 0.546875, 'step': 334},\n",
       "  {'loss': 1.5142111778259277, 'acc': 0.6875, 'step': 335},\n",
       "  {'loss': 1.5485094785690308, 'acc': 0.640625, 'step': 336},\n",
       "  {'loss': 1.5919034481048584, 'acc': 0.625, 'step': 337},\n",
       "  {'loss': 1.5535491704940796, 'acc': 0.640625, 'step': 338},\n",
       "  {'loss': 1.6829057931900024, 'acc': 0.59375, 'step': 339},\n",
       "  {'loss': 1.6743608713150024, 'acc': 0.515625, 'step': 340},\n",
       "  {'loss': 1.56967031955719, 'acc': 0.65625, 'step': 341},\n",
       "  {'loss': 1.4922043085098267, 'acc': 0.71875, 'step': 342},\n",
       "  {'loss': 1.6478874683380127, 'acc': 0.515625, 'step': 343},\n",
       "  {'loss': 1.502730131149292, 'acc': 0.703125, 'step': 344},\n",
       "  {'loss': 1.5285029411315918, 'acc': 0.65625, 'step': 345},\n",
       "  {'loss': 1.4755109548568726, 'acc': 0.734375, 'step': 346},\n",
       "  {'loss': 1.553377389907837, 'acc': 0.59375, 'step': 347},\n",
       "  {'loss': 1.4149941205978394, 'acc': 0.71875, 'step': 348},\n",
       "  {'loss': 1.595153570175171, 'acc': 0.59375, 'step': 349},\n",
       "  {'loss': 1.4471482038497925, 'acc': 0.703125, 'step': 350},\n",
       "  {'loss': 1.488853096961975, 'acc': 0.71875, 'step': 351},\n",
       "  {'loss': 1.598598837852478, 'acc': 0.515625, 'step': 352},\n",
       "  {'loss': 1.4623039960861206, 'acc': 0.65625, 'step': 353},\n",
       "  {'loss': 1.5542867183685303, 'acc': 0.5, 'step': 354},\n",
       "  {'loss': 1.5498861074447632, 'acc': 0.65625, 'step': 355},\n",
       "  {'loss': 1.5478169918060303, 'acc': 0.671875, 'step': 356},\n",
       "  {'loss': 1.4817626476287842, 'acc': 0.609375, 'step': 357},\n",
       "  {'loss': 1.4558573961257935, 'acc': 0.75, 'step': 358},\n",
       "  {'loss': 1.6268256902694702, 'acc': 0.53125, 'step': 359},\n",
       "  {'loss': 1.5665873289108276, 'acc': 0.515625, 'step': 360},\n",
       "  {'loss': 1.464048981666565, 'acc': 0.640625, 'step': 361},\n",
       "  {'loss': 1.5377838611602783, 'acc': 0.5625, 'step': 362},\n",
       "  {'loss': 1.5134974718093872, 'acc': 0.59375, 'step': 363},\n",
       "  {'loss': 1.4336481094360352, 'acc': 0.625, 'step': 364},\n",
       "  {'loss': 1.3701509237289429, 'acc': 0.671875, 'step': 365},\n",
       "  {'loss': 1.5120816230773926, 'acc': 0.59375, 'step': 366},\n",
       "  {'loss': 1.4751837253570557, 'acc': 0.6875, 'step': 367},\n",
       "  {'loss': 1.4685819149017334, 'acc': 0.59375, 'step': 368},\n",
       "  {'loss': 1.4590864181518555, 'acc': 0.609375, 'step': 369},\n",
       "  {'loss': 1.4422212839126587, 'acc': 0.6875, 'step': 370},\n",
       "  {'loss': 1.4686450958251953, 'acc': 0.578125, 'step': 371},\n",
       "  {'loss': 1.4159215688705444, 'acc': 0.625, 'step': 372},\n",
       "  {'loss': 1.372631311416626, 'acc': 0.75, 'step': 373},\n",
       "  {'loss': 1.4627786874771118, 'acc': 0.578125, 'step': 374},\n",
       "  {'loss': 1.4069371223449707, 'acc': 0.6875, 'step': 375},\n",
       "  {'loss': 1.4102911949157715, 'acc': 0.703125, 'step': 376},\n",
       "  {'loss': 1.4659953117370605, 'acc': 0.59375, 'step': 377},\n",
       "  {'loss': 1.3760484457015991, 'acc': 0.625, 'step': 378},\n",
       "  {'loss': 1.4400919675827026, 'acc': 0.625, 'step': 379},\n",
       "  {'loss': 1.4576830863952637, 'acc': 0.59375, 'step': 380},\n",
       "  {'loss': 1.3891127109527588, 'acc': 0.703125, 'step': 381},\n",
       "  {'loss': 1.391636848449707, 'acc': 0.671875, 'step': 382},\n",
       "  {'loss': 1.4392929077148438, 'acc': 0.671875, 'step': 383},\n",
       "  {'loss': 1.5071583986282349, 'acc': 0.578125, 'step': 384},\n",
       "  {'loss': 1.3871381282806396, 'acc': 0.625, 'step': 385},\n",
       "  {'loss': 1.4873294830322266, 'acc': 0.5, 'step': 386},\n",
       "  {'loss': 1.4721269607543945, 'acc': 0.515625, 'step': 387},\n",
       "  {'loss': 1.3531593084335327, 'acc': 0.6875, 'step': 388},\n",
       "  {'loss': 1.48601496219635, 'acc': 0.6875, 'step': 389},\n",
       "  {'loss': 1.3609051704406738, 'acc': 0.609375, 'step': 390},\n",
       "  {'loss': 1.3199573755264282, 'acc': 0.75, 'step': 391},\n",
       "  {'loss': 1.4130926132202148, 'acc': 0.671875, 'step': 392},\n",
       "  {'loss': 1.440659999847412, 'acc': 0.59375, 'step': 393},\n",
       "  {'loss': 1.3602856397628784, 'acc': 0.734375, 'step': 394},\n",
       "  {'loss': 1.458605170249939, 'acc': 0.671875, 'step': 395},\n",
       "  {'loss': 1.3461319208145142, 'acc': 0.6875, 'step': 396},\n",
       "  {'loss': 1.335115909576416, 'acc': 0.640625, 'step': 397},\n",
       "  {'loss': 1.391883134841919, 'acc': 0.546875, 'step': 398},\n",
       "  {'loss': 1.408524513244629, 'acc': 0.65625, 'step': 399},\n",
       "  {'loss': 1.3129079341888428, 'acc': 0.703125, 'step': 400},\n",
       "  {'loss': 1.3078207969665527, 'acc': 0.703125, 'step': 401},\n",
       "  {'loss': 1.3944194316864014, 'acc': 0.609375, 'step': 402},\n",
       "  {'loss': 1.3572022914886475, 'acc': 0.609375, 'step': 403},\n",
       "  {'loss': 1.320528268814087, 'acc': 0.671875, 'step': 404},\n",
       "  {'loss': 1.3710583448410034, 'acc': 0.640625, 'step': 405},\n",
       "  {'loss': 1.3138271570205688, 'acc': 0.671875, 'step': 406},\n",
       "  {'loss': 1.3383779525756836, 'acc': 0.703125, 'step': 407},\n",
       "  {'loss': 1.2792648077011108, 'acc': 0.640625, 'step': 408},\n",
       "  {'loss': 1.3114205598831177, 'acc': 0.625, 'step': 409},\n",
       "  {'loss': 1.3277060985565186, 'acc': 0.6875, 'step': 410},\n",
       "  {'loss': 1.2959787845611572, 'acc': 0.625, 'step': 411},\n",
       "  {'loss': 1.2787833213806152, 'acc': 0.6875, 'step': 412},\n",
       "  {'loss': 1.391179084777832, 'acc': 0.609375, 'step': 413},\n",
       "  {'loss': 1.2508420944213867, 'acc': 0.703125, 'step': 414},\n",
       "  {'loss': 1.3220263719558716, 'acc': 0.59375, 'step': 415},\n",
       "  {'loss': 1.263378620147705, 'acc': 0.6875, 'step': 416},\n",
       "  {'loss': 1.390028953552246, 'acc': 0.546875, 'step': 417},\n",
       "  {'loss': 1.3442400693893433, 'acc': 0.59375, 'step': 418},\n",
       "  {'loss': 1.2659912109375, 'acc': 0.625, 'step': 419},\n",
       "  {'loss': 1.2072981595993042, 'acc': 0.671875, 'step': 420},\n",
       "  {'loss': 1.3038817644119263, 'acc': 0.6875, 'step': 421},\n",
       "  {'loss': 1.284576416015625, 'acc': 0.640625, 'step': 422},\n",
       "  {'loss': 1.1948251724243164, 'acc': 0.6875, 'step': 423},\n",
       "  {'loss': 1.2538177967071533, 'acc': 0.609375, 'step': 424},\n",
       "  {'loss': 1.2750800848007202, 'acc': 0.65625, 'step': 425},\n",
       "  {'loss': 1.338407039642334, 'acc': 0.5, 'step': 426},\n",
       "  {'loss': 1.241113543510437, 'acc': 0.65625, 'step': 427},\n",
       "  {'loss': 1.2109812498092651, 'acc': 0.65625, 'step': 428},\n",
       "  {'loss': 1.3406693935394287, 'acc': 0.53125, 'step': 429},\n",
       "  {'loss': 1.2682721614837646, 'acc': 0.65625, 'step': 430},\n",
       "  {'loss': 1.3881137371063232, 'acc': 0.53125, 'step': 431},\n",
       "  {'loss': 1.2454750537872314, 'acc': 0.71875, 'step': 432},\n",
       "  {'loss': 1.3054180145263672, 'acc': 0.578125, 'step': 433},\n",
       "  {'loss': 1.2485084533691406, 'acc': 0.703125, 'step': 434},\n",
       "  {'loss': 1.2913862466812134, 'acc': 0.625, 'step': 435},\n",
       "  {'loss': 1.1597994565963745, 'acc': 0.671875, 'step': 436},\n",
       "  {'loss': 1.2502495050430298, 'acc': 0.625, 'step': 437},\n",
       "  {'loss': 1.233816385269165, 'acc': 0.609375, 'step': 438},\n",
       "  {'loss': 1.3192192316055298, 'acc': 0.609375, 'step': 439},\n",
       "  {'loss': 1.2469651699066162, 'acc': 0.59375, 'step': 440},\n",
       "  {'loss': 1.1634937524795532, 'acc': 0.640625, 'step': 441},\n",
       "  {'loss': 1.3035998344421387, 'acc': 0.5625, 'step': 442},\n",
       "  {'loss': 1.249725341796875, 'acc': 0.609375, 'step': 443},\n",
       "  {'loss': 1.3761069774627686, 'acc': 0.546875, 'step': 444},\n",
       "  {'loss': 1.2647401094436646, 'acc': 0.65625, 'step': 445},\n",
       "  {'loss': 1.2565664052963257, 'acc': 0.640625, 'step': 446},\n",
       "  {'loss': 1.2017786502838135, 'acc': 0.734375, 'step': 447},\n",
       "  {'loss': 1.3423819541931152, 'acc': 0.515625, 'step': 448},\n",
       "  {'loss': 1.2427005767822266, 'acc': 0.65625, 'step': 449},\n",
       "  {'loss': 1.2167283296585083, 'acc': 0.640625, 'step': 450},\n",
       "  {'loss': 1.278115153312683, 'acc': 0.640625, 'step': 451},\n",
       "  {'loss': 1.229042649269104, 'acc': 0.578125, 'step': 452},\n",
       "  {'loss': 1.2539640665054321, 'acc': 0.578125, 'step': 453},\n",
       "  {'loss': 1.232873558998108, 'acc': 0.578125, 'step': 454},\n",
       "  {'loss': 1.2458316087722778, 'acc': 0.59375, 'step': 455},\n",
       "  {'loss': 1.3098996877670288, 'acc': 0.609375, 'step': 456},\n",
       "  {'loss': 1.2743595838546753, 'acc': 0.59375, 'step': 457},\n",
       "  {'loss': 1.2547056674957275, 'acc': 0.703125, 'step': 458},\n",
       "  {'loss': 1.281144142150879, 'acc': 0.546875, 'step': 459},\n",
       "  {'loss': 1.1718825101852417, 'acc': 0.703125, 'step': 460},\n",
       "  {'loss': 1.318574070930481, 'acc': 0.515625, 'step': 461},\n",
       "  {'loss': 1.2636743783950806, 'acc': 0.5625, 'step': 462},\n",
       "  {'loss': 1.198207974433899, 'acc': 0.609375, 'step': 463},\n",
       "  {'loss': 1.2570008039474487, 'acc': 0.640625, 'step': 464},\n",
       "  {'loss': 1.274608850479126, 'acc': 0.640625, 'step': 465},\n",
       "  {'loss': 1.170472264289856, 'acc': 0.65625, 'step': 466},\n",
       "  {'loss': 1.2098041772842407, 'acc': 0.65625, 'step': 467},\n",
       "  {'loss': 1.0972856283187866, 'acc': 0.71875, 'step': 468},\n",
       "  {'loss': 1.14264714717865, 'acc': 0.75, 'step': 469},\n",
       "  {'loss': 1.2529724836349487, 'acc': 0.546875, 'step': 470},\n",
       "  {'loss': 1.1781381368637085, 'acc': 0.625, 'step': 471},\n",
       "  {'loss': 1.2213979959487915, 'acc': 0.625, 'step': 472},\n",
       "  {'loss': 1.2502559423446655, 'acc': 0.625, 'step': 473},\n",
       "  {'loss': 1.1846264600753784, 'acc': 0.6875, 'step': 474},\n",
       "  {'loss': 1.2122068405151367, 'acc': 0.671875, 'step': 475},\n",
       "  {'loss': 1.1524736881256104, 'acc': 0.734375, 'step': 476},\n",
       "  {'loss': 1.1366502046585083, 'acc': 0.65625, 'step': 477},\n",
       "  {'loss': 1.1654791831970215, 'acc': 0.6875, 'step': 478},\n",
       "  {'loss': 1.1447968482971191, 'acc': 0.65625, 'step': 479},\n",
       "  {'loss': 1.236583948135376, 'acc': 0.640625, 'step': 480},\n",
       "  {'loss': 1.2110897302627563, 'acc': 0.640625, 'step': 481},\n",
       "  {'loss': 1.1689726114273071, 'acc': 0.65625, 'step': 482},\n",
       "  {'loss': 1.0789179801940918, 'acc': 0.734375, 'step': 483},\n",
       "  {'loss': 1.1237846612930298, 'acc': 0.71875, 'step': 484},\n",
       "  {'loss': 1.12167227268219, 'acc': 0.59375, 'step': 485},\n",
       "  {'loss': 1.1623295545578003, 'acc': 0.625, 'step': 486},\n",
       "  {'loss': 1.2300257682800293, 'acc': 0.640625, 'step': 487},\n",
       "  {'loss': 1.1231359243392944, 'acc': 0.6875, 'step': 488},\n",
       "  {'loss': 1.2432218790054321, 'acc': 0.5625, 'step': 489},\n",
       "  {'loss': 1.2121628522872925, 'acc': 0.546875, 'step': 490},\n",
       "  {'loss': 1.179793119430542, 'acc': 0.609375, 'step': 491},\n",
       "  {'loss': 1.1268830299377441, 'acc': 0.578125, 'step': 492},\n",
       "  {'loss': 1.1243151426315308, 'acc': 0.625, 'step': 493},\n",
       "  {'loss': 1.186232566833496, 'acc': 0.578125, 'step': 494},\n",
       "  {'loss': 1.1192647218704224, 'acc': 0.609375, 'step': 495},\n",
       "  {'loss': 1.2421901226043701, 'acc': 0.5625, 'step': 496},\n",
       "  {'loss': 1.170197606086731, 'acc': 0.59375, 'step': 497},\n",
       "  {'loss': 1.1170414686203003, 'acc': 0.65625, 'step': 498},\n",
       "  {'loss': 0.9959519505500793, 'acc': 0.75, 'step': 499},\n",
       "  {'loss': 1.166434407234192, 'acc': 0.65625, 'step': 500},\n",
       "  {'loss': 1.1135039329528809, 'acc': 0.71875, 'step': 501},\n",
       "  {'loss': 1.2413852214813232, 'acc': 0.609375, 'step': 502},\n",
       "  {'loss': 1.1913117170333862, 'acc': 0.609375, 'step': 503},\n",
       "  {'loss': 1.1779944896697998, 'acc': 0.640625, 'step': 504},\n",
       "  {'loss': 1.1705282926559448, 'acc': 0.578125, 'step': 505},\n",
       "  {'loss': 1.057823896408081, 'acc': 0.671875, 'step': 506},\n",
       "  {'loss': 1.048620581626892, 'acc': 0.65625, 'step': 507},\n",
       "  {'loss': 1.1482332944869995, 'acc': 0.640625, 'step': 508},\n",
       "  {'loss': 1.1112804412841797, 'acc': 0.6875, 'step': 509},\n",
       "  {'loss': 1.1196956634521484, 'acc': 0.6875, 'step': 510},\n",
       "  {'loss': 1.0064085721969604, 'acc': 0.765625, 'step': 511},\n",
       "  {'loss': 1.0587295293807983, 'acc': 0.734375, 'step': 512},\n",
       "  {'loss': 1.276802897453308, 'acc': 0.59375, 'step': 513},\n",
       "  {'loss': 1.0897841453552246, 'acc': 0.671875, 'step': 514},\n",
       "  {'loss': 1.0346472263336182, 'acc': 0.65625, 'step': 515},\n",
       "  {'loss': 1.1501530408859253, 'acc': 0.6875, 'step': 516},\n",
       "  {'loss': 1.0097706317901611, 'acc': 0.71875, 'step': 517},\n",
       "  {'loss': 1.0596466064453125, 'acc': 0.671875, 'step': 518},\n",
       "  {'loss': 1.111640453338623, 'acc': 0.59375, 'step': 519},\n",
       "  {'loss': 1.1717816591262817, 'acc': 0.640625, 'step': 520},\n",
       "  {'loss': 1.0790472030639648, 'acc': 0.671875, 'step': 521},\n",
       "  {'loss': 1.0809645652770996, 'acc': 0.71875, 'step': 522},\n",
       "  {'loss': 1.2117185592651367, 'acc': 0.515625, 'step': 523},\n",
       "  {'loss': 1.2358872890472412, 'acc': 0.546875, 'step': 524},\n",
       "  {'loss': 1.0803645849227905, 'acc': 0.65625, 'step': 525},\n",
       "  {'loss': 0.9954220652580261, 'acc': 0.734375, 'step': 526},\n",
       "  {'loss': 1.197239637374878, 'acc': 0.640625, 'step': 527},\n",
       "  {'loss': 1.01833176612854, 'acc': 0.71875, 'step': 528},\n",
       "  {'loss': 1.0748324394226074, 'acc': 0.65625, 'step': 529},\n",
       "  {'loss': 1.1784871816635132, 'acc': 0.484375, 'step': 530},\n",
       "  {'loss': 1.090013861656189, 'acc': 0.640625, 'step': 531},\n",
       "  {'loss': 1.0648057460784912, 'acc': 0.71875, 'step': 532},\n",
       "  {'loss': 1.011008381843567, 'acc': 0.6875, 'step': 533},\n",
       "  {'loss': 1.0572844743728638, 'acc': 0.671875, 'step': 534},\n",
       "  {'loss': 1.1125376224517822, 'acc': 0.59375, 'step': 535},\n",
       "  {'loss': 1.2189806699752808, 'acc': 0.53125, 'step': 536},\n",
       "  {'loss': 1.0454908609390259, 'acc': 0.75, 'step': 537},\n",
       "  {'loss': 1.0247870683670044, 'acc': 0.734375, 'step': 538},\n",
       "  {'loss': 1.2184946537017822, 'acc': 0.515625, 'step': 539},\n",
       "  {'loss': 1.1636767387390137, 'acc': 0.53125, 'step': 540},\n",
       "  {'loss': 1.1526061296463013, 'acc': 0.546875, 'step': 541},\n",
       "  {'loss': 1.048028826713562, 'acc': 0.6875, 'step': 542},\n",
       "  {'loss': 1.1862021684646606, 'acc': 0.609375, 'step': 543},\n",
       "  {'loss': 1.1738389730453491, 'acc': 0.625, 'step': 544},\n",
       "  {'loss': 1.0853315591812134, 'acc': 0.625, 'step': 545},\n",
       "  {'loss': 0.9996992945671082, 'acc': 0.6875, 'step': 546},\n",
       "  {'loss': 1.0800533294677734, 'acc': 0.640625, 'step': 547},\n",
       "  {'loss': 1.1413192749023438, 'acc': 0.59375, 'step': 548},\n",
       "  {'loss': 1.1768958568572998, 'acc': 0.578125, 'step': 549},\n",
       "  {'loss': 1.1914405822753906, 'acc': 0.546875, 'step': 550},\n",
       "  {'loss': 1.1408663988113403, 'acc': 0.5625, 'step': 551},\n",
       "  {'loss': 1.0421383380889893, 'acc': 0.6875, 'step': 552},\n",
       "  {'loss': 1.1716026067733765, 'acc': 0.625, 'step': 553},\n",
       "  {'loss': 0.9918054938316345, 'acc': 0.703125, 'step': 554},\n",
       "  {'loss': 1.0840704441070557, 'acc': 0.65625, 'step': 555},\n",
       "  {'loss': 0.9898991584777832, 'acc': 0.734375, 'step': 556},\n",
       "  {'loss': 1.0651742219924927, 'acc': 0.65625, 'step': 557},\n",
       "  {'loss': 0.9488109350204468, 'acc': 0.671875, 'step': 558},\n",
       "  {'loss': 1.1362347602844238, 'acc': 0.65625, 'step': 559},\n",
       "  {'loss': 1.152524471282959, 'acc': 0.65625, 'step': 560},\n",
       "  {'loss': 1.071312427520752, 'acc': 0.578125, 'step': 561},\n",
       "  {'loss': 0.9384759068489075, 'acc': 0.703125, 'step': 562},\n",
       "  {'loss': 1.2929562330245972, 'acc': 0.546875, 'step': 563},\n",
       "  {'loss': 1.046999216079712, 'acc': 0.71875, 'step': 564},\n",
       "  {'loss': 1.0760273933410645, 'acc': 0.671875, 'step': 565},\n",
       "  {'loss': 1.0909802913665771, 'acc': 0.6875, 'step': 566},\n",
       "  {'loss': 1.0955073833465576, 'acc': 0.65625, 'step': 567},\n",
       "  {'loss': 0.9326692223548889, 'acc': 0.734375, 'step': 568},\n",
       "  {'loss': 0.9836812019348145, 'acc': 0.78125, 'step': 569},\n",
       "  {'loss': 1.084568738937378, 'acc': 0.671875, 'step': 570},\n",
       "  {'loss': 1.0224065780639648, 'acc': 0.703125, 'step': 571},\n",
       "  {'loss': 0.9270509481430054, 'acc': 0.765625, 'step': 572},\n",
       "  {'loss': 1.083457112312317, 'acc': 0.640625, 'step': 573},\n",
       "  {'loss': 1.1895923614501953, 'acc': 0.625, 'step': 574},\n",
       "  {'loss': 0.9873749017715454, 'acc': 0.71875, 'step': 575},\n",
       "  {'loss': 1.293470025062561, 'acc': 0.515625, 'step': 576},\n",
       "  {'loss': 1.116811990737915, 'acc': 0.640625, 'step': 577},\n",
       "  {'loss': 0.9892562627792358, 'acc': 0.65625, 'step': 578},\n",
       "  {'loss': 1.0463734865188599, 'acc': 0.59375, 'step': 579},\n",
       "  {'loss': 1.1169724464416504, 'acc': 0.59375, 'step': 580},\n",
       "  {'loss': 1.0726475715637207, 'acc': 0.625, 'step': 581},\n",
       "  {'loss': 1.0670784711837769, 'acc': 0.640625, 'step': 582},\n",
       "  {'loss': 1.0272748470306396, 'acc': 0.625, 'step': 583},\n",
       "  {'loss': 0.8941975235939026, 'acc': 0.765625, 'step': 584},\n",
       "  {'loss': 1.0975760221481323, 'acc': 0.625, 'step': 585},\n",
       "  {'loss': 1.047390103340149, 'acc': 0.671875, 'step': 586},\n",
       "  {'loss': 0.9650037884712219, 'acc': 0.71875, 'step': 587},\n",
       "  {'loss': 1.0688725709915161, 'acc': 0.609375, 'step': 588},\n",
       "  {'loss': 0.9390501976013184, 'acc': 0.71875, 'step': 589},\n",
       "  {'loss': 1.1286567449569702, 'acc': 0.65625, 'step': 590},\n",
       "  {'loss': 1.0582798719406128, 'acc': 0.640625, 'step': 591},\n",
       "  {'loss': 0.9916948080062866, 'acc': 0.703125, 'step': 592},\n",
       "  {'loss': 1.0443115234375, 'acc': 0.640625, 'step': 593},\n",
       "  {'loss': 0.9666948914527893, 'acc': 0.6875, 'step': 594},\n",
       "  {'loss': 0.9819507598876953, 'acc': 0.640625, 'step': 595},\n",
       "  {'loss': 0.8931535482406616, 'acc': 0.75, 'step': 596},\n",
       "  {'loss': 1.0327144861221313, 'acc': 0.65625, 'step': 597},\n",
       "  {'loss': 1.1135519742965698, 'acc': 0.625, 'step': 598},\n",
       "  {'loss': 1.0007230043411255, 'acc': 0.71875, 'step': 599},\n",
       "  {'loss': 1.0452136993408203, 'acc': 0.71875, 'step': 600},\n",
       "  {'loss': 1.0056121349334717, 'acc': 0.609375, 'step': 601},\n",
       "  {'loss': 1.025530457496643, 'acc': 0.609375, 'step': 602},\n",
       "  {'loss': 0.8297406435012817, 'acc': 0.8125, 'step': 603},\n",
       "  {'loss': 1.0792313814163208, 'acc': 0.640625, 'step': 604},\n",
       "  {'loss': 1.1287769079208374, 'acc': 0.5, 'step': 605},\n",
       "  {'loss': 1.254834771156311, 'acc': 0.609375, 'step': 606},\n",
       "  {'loss': 1.0299956798553467, 'acc': 0.59375, 'step': 607},\n",
       "  {'loss': 0.9479197859764099, 'acc': 0.6875, 'step': 608},\n",
       "  {'loss': 0.983886182308197, 'acc': 0.625, 'step': 609},\n",
       "  {'loss': 1.0492222309112549, 'acc': 0.609375, 'step': 610},\n",
       "  {'loss': 1.0217491388320923, 'acc': 0.609375, 'step': 611},\n",
       "  {'loss': 1.0155898332595825, 'acc': 0.609375, 'step': 612},\n",
       "  {'loss': 1.028601050376892, 'acc': 0.625, 'step': 613},\n",
       "  {'loss': 1.0523345470428467, 'acc': 0.609375, 'step': 614},\n",
       "  {'loss': 1.0209921598434448, 'acc': 0.65625, 'step': 615},\n",
       "  {'loss': 1.0286176204681396, 'acc': 0.703125, 'step': 616},\n",
       "  {'loss': 1.0672519207000732, 'acc': 0.65625, 'step': 617},\n",
       "  {'loss': 1.1611342430114746, 'acc': 0.578125, 'step': 618},\n",
       "  {'loss': 0.9732350707054138, 'acc': 0.71875, 'step': 619},\n",
       "  {'loss': 0.9975757002830505, 'acc': 0.65625, 'step': 620},\n",
       "  {'loss': 1.139448642730713, 'acc': 0.6875, 'step': 621},\n",
       "  {'loss': 0.9305241107940674, 'acc': 0.78125, 'step': 622},\n",
       "  {'loss': 0.9799906611442566, 'acc': 0.6875, 'step': 623},\n",
       "  {'loss': 1.0441758632659912, 'acc': 0.65625, 'step': 624},\n",
       "  {'loss': 1.1247687339782715, 'acc': 0.625, 'step': 625},\n",
       "  {'loss': 0.9183775782585144, 'acc': 0.71875, 'step': 626},\n",
       "  {'loss': 0.9905659556388855, 'acc': 0.625, 'step': 627},\n",
       "  {'loss': 0.9656640291213989, 'acc': 0.703125, 'step': 628},\n",
       "  {'loss': 0.9958932399749756, 'acc': 0.734375, 'step': 629},\n",
       "  {'loss': 0.9291390180587769, 'acc': 0.734375, 'step': 630},\n",
       "  {'loss': 1.0164883136749268, 'acc': 0.640625, 'step': 631},\n",
       "  {'loss': 0.9151526093482971, 'acc': 0.6875, 'step': 632},\n",
       "  {'loss': 0.9392522573471069, 'acc': 0.703125, 'step': 633},\n",
       "  {'loss': 1.0276455879211426, 'acc': 0.65625, 'step': 634},\n",
       "  {'loss': 0.9407281279563904, 'acc': 0.671875, 'step': 635},\n",
       "  {'loss': 1.0090281963348389, 'acc': 0.671875, 'step': 636},\n",
       "  {'loss': 0.9523645043373108, 'acc': 0.765625, 'step': 637},\n",
       "  {'loss': 0.9637280702590942, 'acc': 0.671875, 'step': 638},\n",
       "  {'loss': 0.9074244499206543, 'acc': 0.765625, 'step': 639},\n",
       "  {'loss': 1.0013216733932495, 'acc': 0.6875, 'step': 640},\n",
       "  {'loss': 0.9262925386428833, 'acc': 0.671875, 'step': 641},\n",
       "  {'loss': 0.9522597193717957, 'acc': 0.625, 'step': 642},\n",
       "  {'loss': 0.9137250781059265, 'acc': 0.75, 'step': 643},\n",
       "  {'loss': 0.9385013580322266, 'acc': 0.640625, 'step': 644},\n",
       "  {'loss': 0.9663724899291992, 'acc': 0.640625, 'step': 645},\n",
       "  {'loss': 0.9190970063209534, 'acc': 0.6875, 'step': 646},\n",
       "  {'loss': 1.0944278240203857, 'acc': 0.671875, 'step': 647},\n",
       "  {'loss': 0.9601166248321533, 'acc': 0.703125, 'step': 648},\n",
       "  {'loss': 0.999282717704773, 'acc': 0.59375, 'step': 649},\n",
       "  {'loss': 0.9323787689208984, 'acc': 0.65625, 'step': 650},\n",
       "  {'loss': 1.0471595525741577, 'acc': 0.609375, 'step': 651},\n",
       "  {'loss': 0.8678976893424988, 'acc': 0.671875, 'step': 652},\n",
       "  {'loss': 0.8497211337089539, 'acc': 0.75, 'step': 653},\n",
       "  {'loss': 0.9355112910270691, 'acc': 0.609375, 'step': 654},\n",
       "  {'loss': 0.8848177194595337, 'acc': 0.703125, 'step': 655},\n",
       "  {'loss': 0.9131116271018982, 'acc': 0.703125, 'step': 656},\n",
       "  {'loss': 0.9245194792747498, 'acc': 0.78125, 'step': 657},\n",
       "  {'loss': 1.1044094562530518, 'acc': 0.625, 'step': 658},\n",
       "  {'loss': 1.1202155351638794, 'acc': 0.578125, 'step': 659},\n",
       "  {'loss': 1.0066752433776855, 'acc': 0.609375, 'step': 660},\n",
       "  {'loss': 0.9247901439666748, 'acc': 0.65625, 'step': 661},\n",
       "  {'loss': 1.0019761323928833, 'acc': 0.65625, 'step': 662},\n",
       "  {'loss': 1.0616998672485352, 'acc': 0.625, 'step': 663},\n",
       "  {'loss': 0.9551724195480347, 'acc': 0.703125, 'step': 664},\n",
       "  {'loss': 1.0373624563217163, 'acc': 0.59375, 'step': 665},\n",
       "  {'loss': 0.9658750891685486, 'acc': 0.578125, 'step': 666},\n",
       "  {'loss': 0.8980470895767212, 'acc': 0.65625, 'step': 667},\n",
       "  {'loss': 1.1191354990005493, 'acc': 0.609375, 'step': 668},\n",
       "  {'loss': 0.9883209466934204, 'acc': 0.5625, 'step': 669},\n",
       "  {'loss': 0.9846512675285339, 'acc': 0.625, 'step': 670},\n",
       "  {'loss': 0.9161025881767273, 'acc': 0.734375, 'step': 671},\n",
       "  {'loss': 1.0351369380950928, 'acc': 0.578125, 'step': 672},\n",
       "  {'loss': 0.8787674903869629, 'acc': 0.734375, 'step': 673},\n",
       "  {'loss': 0.9984674453735352, 'acc': 0.65625, 'step': 674},\n",
       "  {'loss': 0.9630961418151855, 'acc': 0.640625, 'step': 675},\n",
       "  {'loss': 0.96967613697052, 'acc': 0.640625, 'step': 676},\n",
       "  {'loss': 0.8777413368225098, 'acc': 0.75, 'step': 677},\n",
       "  {'loss': 0.977180540561676, 'acc': 0.609375, 'step': 678},\n",
       "  {'loss': 1.1324516534805298, 'acc': 0.546875, 'step': 679},\n",
       "  {'loss': 1.069534420967102, 'acc': 0.625, 'step': 680},\n",
       "  {'loss': 0.9724619388580322, 'acc': 0.734375, 'step': 681},\n",
       "  {'loss': 0.9806331396102905, 'acc': 0.65625, 'step': 682},\n",
       "  {'loss': 1.0815225839614868, 'acc': 0.625, 'step': 683},\n",
       "  {'loss': 0.9053523540496826, 'acc': 0.703125, 'step': 684},\n",
       "  {'loss': 0.9871670007705688, 'acc': 0.640625, 'step': 685},\n",
       "  {'loss': 0.8971390724182129, 'acc': 0.671875, 'step': 686},\n",
       "  {'loss': 0.8374172449111938, 'acc': 0.71875, 'step': 687},\n",
       "  {'loss': 1.000836968421936, 'acc': 0.609375, 'step': 688},\n",
       "  {'loss': 0.841586709022522, 'acc': 0.796875, 'step': 689},\n",
       "  {'loss': 0.8112381100654602, 'acc': 0.796875, 'step': 690},\n",
       "  {'loss': 0.8361663222312927, 'acc': 0.71875, 'step': 691},\n",
       "  {'loss': 0.926389217376709, 'acc': 0.65625, 'step': 692},\n",
       "  {'loss': 0.9587230086326599, 'acc': 0.703125, 'step': 693},\n",
       "  {'loss': 0.9657891392707825, 'acc': 0.640625, 'step': 694},\n",
       "  {'loss': 0.9302589893341064, 'acc': 0.71875, 'step': 695},\n",
       "  {'loss': 1.070478081703186, 'acc': 0.53125, 'step': 696},\n",
       "  {'loss': 0.9162920117378235, 'acc': 0.640625, 'step': 697},\n",
       "  {'loss': 0.9287225008010864, 'acc': 0.71875, 'step': 698},\n",
       "  {'loss': 0.9980794787406921, 'acc': 0.515625, 'step': 699},\n",
       "  {'loss': 0.8349200487136841, 'acc': 0.734375, 'step': 700},\n",
       "  {'loss': 1.0853015184402466, 'acc': 0.625, 'step': 701},\n",
       "  {'loss': 0.9540853500366211, 'acc': 0.671875, 'step': 702},\n",
       "  {'loss': 0.9886601567268372, 'acc': 0.59375, 'step': 703},\n",
       "  {'loss': 0.943175196647644, 'acc': 0.59375, 'step': 704},\n",
       "  {'loss': 0.8549830317497253, 'acc': 0.75, 'step': 705},\n",
       "  {'loss': 0.8951291441917419, 'acc': 0.734375, 'step': 706},\n",
       "  {'loss': 0.9344806671142578, 'acc': 0.640625, 'step': 707},\n",
       "  {'loss': 1.000190019607544, 'acc': 0.671875, 'step': 708},\n",
       "  {'loss': 0.9485898613929749, 'acc': 0.703125, 'step': 709},\n",
       "  {'loss': 0.8655731678009033, 'acc': 0.71875, 'step': 710},\n",
       "  {'loss': 1.0766931772232056, 'acc': 0.515625, 'step': 711},\n",
       "  {'loss': 1.0054410696029663, 'acc': 0.640625, 'step': 712},\n",
       "  {'loss': 0.8414866328239441, 'acc': 0.71875, 'step': 713},\n",
       "  {'loss': 0.8652443289756775, 'acc': 0.703125, 'step': 714},\n",
       "  {'loss': 1.110696792602539, 'acc': 0.578125, 'step': 715},\n",
       "  {'loss': 0.878045380115509, 'acc': 0.734375, 'step': 716},\n",
       "  {'loss': 0.9646024703979492, 'acc': 0.640625, 'step': 717},\n",
       "  {'loss': 0.8336881995201111, 'acc': 0.765625, 'step': 718},\n",
       "  {'loss': 1.0637407302856445, 'acc': 0.59375, 'step': 719},\n",
       "  {'loss': 0.8845092058181763, 'acc': 0.671875, 'step': 720},\n",
       "  {'loss': 0.9904131889343262, 'acc': 0.6875, 'step': 721},\n",
       "  {'loss': 0.8918591737747192, 'acc': 0.6875, 'step': 722},\n",
       "  {'loss': 0.9392381906509399, 'acc': 0.6875, 'step': 723},\n",
       "  {'loss': 0.8209273815155029, 'acc': 0.6875, 'step': 724},\n",
       "  {'loss': 0.9300704598426819, 'acc': 0.65625, 'step': 725},\n",
       "  {'loss': 0.8596199750900269, 'acc': 0.703125, 'step': 726},\n",
       "  {'loss': 0.8995282649993896, 'acc': 0.640625, 'step': 727},\n",
       "  {'loss': 0.8889690041542053, 'acc': 0.640625, 'step': 728},\n",
       "  {'loss': 0.9220746159553528, 'acc': 0.625, 'step': 729},\n",
       "  {'loss': 0.8620961904525757, 'acc': 0.703125, 'step': 730},\n",
       "  {'loss': 0.9297666549682617, 'acc': 0.640625, 'step': 731},\n",
       "  {'loss': 0.9610390663146973, 'acc': 0.578125, 'step': 732},\n",
       "  {'loss': 0.7634713649749756, 'acc': 0.796875, 'step': 733},\n",
       "  {'loss': 0.9829405546188354, 'acc': 0.59375, 'step': 734},\n",
       "  {'loss': 0.9339978098869324, 'acc': 0.609375, 'step': 735},\n",
       "  {'loss': 0.927680253982544, 'acc': 0.6875, 'step': 736},\n",
       "  {'loss': 0.8884568810462952, 'acc': 0.734375, 'step': 737},\n",
       "  {'loss': 0.8079747557640076, 'acc': 0.703125, 'step': 738},\n",
       "  {'loss': 0.9686594009399414, 'acc': 0.640625, 'step': 739},\n",
       "  {'loss': 0.9574507474899292, 'acc': 0.65625, 'step': 740},\n",
       "  {'loss': 0.9583293199539185, 'acc': 0.640625, 'step': 741},\n",
       "  {'loss': 0.8968349099159241, 'acc': 0.609375, 'step': 742},\n",
       "  {'loss': 0.7704257369041443, 'acc': 0.78125, 'step': 743},\n",
       "  {'loss': 1.0003671646118164, 'acc': 0.640625, 'step': 744},\n",
       "  {'loss': 1.0007387399673462, 'acc': 0.5625, 'step': 745},\n",
       "  {'loss': 0.9267807602882385, 'acc': 0.671875, 'step': 746},\n",
       "  {'loss': 1.053439736366272, 'acc': 0.65625, 'step': 747},\n",
       "  {'loss': 1.0180410146713257, 'acc': 0.640625, 'step': 748},\n",
       "  {'loss': 0.874264657497406, 'acc': 0.640625, 'step': 749},\n",
       "  {'loss': 0.9829238057136536, 'acc': 0.65625, 'step': 750},\n",
       "  {'loss': 0.8346120715141296, 'acc': 0.765625, 'step': 751},\n",
       "  {'loss': 0.9013016819953918, 'acc': 0.71875, 'step': 752},\n",
       "  {'loss': 1.037099838256836, 'acc': 0.578125, 'step': 753},\n",
       "  {'loss': 0.8916470408439636, 'acc': 0.71875, 'step': 754},\n",
       "  {'loss': 0.9172755479812622, 'acc': 0.71875, 'step': 755},\n",
       "  {'loss': 0.8296770453453064, 'acc': 0.71875, 'step': 756},\n",
       "  {'loss': 1.058545470237732, 'acc': 0.609375, 'step': 757},\n",
       "  {'loss': 1.0869837999343872, 'acc': 0.640625, 'step': 758},\n",
       "  {'loss': 0.9543251991271973, 'acc': 0.65625, 'step': 759},\n",
       "  {'loss': 0.9331560134887695, 'acc': 0.546875, 'step': 760},\n",
       "  {'loss': 0.920452356338501, 'acc': 0.703125, 'step': 761},\n",
       "  {'loss': 0.813703715801239, 'acc': 0.625, 'step': 762},\n",
       "  {'loss': 0.8279611468315125, 'acc': 0.640625, 'step': 763},\n",
       "  {'loss': 0.9753934144973755, 'acc': 0.640625, 'step': 764},\n",
       "  {'loss': 0.8378985524177551, 'acc': 0.71875, 'step': 765},\n",
       "  {'loss': 0.965228259563446, 'acc': 0.609375, 'step': 766},\n",
       "  {'loss': 0.8758282661437988, 'acc': 0.59375, 'step': 767},\n",
       "  {'loss': 0.8884963989257812, 'acc': 0.609375, 'step': 768},\n",
       "  {'loss': 0.9211132526397705, 'acc': 0.703125, 'step': 769},\n",
       "  {'loss': 0.9629223942756653, 'acc': 0.65625, 'step': 770},\n",
       "  {'loss': 0.8713148832321167, 'acc': 0.65625, 'step': 771},\n",
       "  {'loss': 0.9595826268196106, 'acc': 0.6875, 'step': 772},\n",
       "  {'loss': 0.9640740752220154, 'acc': 0.65625, 'step': 773},\n",
       "  {'loss': 0.747772216796875, 'acc': 0.765625, 'step': 774},\n",
       "  {'loss': 1.014315128326416, 'acc': 0.65625, 'step': 775},\n",
       "  {'loss': 0.9263269305229187, 'acc': 0.5625, 'step': 776},\n",
       "  {'loss': 0.8147364854812622, 'acc': 0.703125, 'step': 777},\n",
       "  {'loss': 0.8972809314727783, 'acc': 0.6875, 'step': 778},\n",
       "  {'loss': 0.9376375675201416, 'acc': 0.65625, 'step': 779},\n",
       "  {'loss': 1.1174079179763794, 'acc': 0.5625, 'step': 780},\n",
       "  {'loss': 0.8393716812133789, 'acc': 0.71875, 'step': 781},\n",
       "  {'loss': 0.9022437930107117, 'acc': 0.640625, 'step': 782},\n",
       "  {'loss': 0.8637642860412598, 'acc': 0.671875, 'step': 783},\n",
       "  {'loss': 0.9961050748825073, 'acc': 0.65625, 'step': 784},\n",
       "  {'loss': 0.9799346923828125, 'acc': 0.625, 'step': 785},\n",
       "  {'loss': 1.0577324628829956, 'acc': 0.546875, 'step': 786},\n",
       "  {'loss': 0.7656124234199524, 'acc': 0.6875, 'step': 787},\n",
       "  {'loss': 0.8054084181785583, 'acc': 0.734375, 'step': 788},\n",
       "  {'loss': 0.7741015553474426, 'acc': 0.703125, 'step': 789},\n",
       "  {'loss': 0.8559461832046509, 'acc': 0.65625, 'step': 790},\n",
       "  {'loss': 0.9764235019683838, 'acc': 0.625, 'step': 791},\n",
       "  {'loss': 0.8754480481147766, 'acc': 0.6875, 'step': 792},\n",
       "  {'loss': 0.71945720911026, 'acc': 0.765625, 'step': 793},\n",
       "  {'loss': 0.8036717772483826, 'acc': 0.765625, 'step': 794},\n",
       "  {'loss': 0.7914150953292847, 'acc': 0.6875, 'step': 795},\n",
       "  {'loss': 0.7492536306381226, 'acc': 0.703125, 'step': 796},\n",
       "  {'loss': 0.8292651176452637, 'acc': 0.703125, 'step': 797},\n",
       "  {'loss': 0.945701539516449, 'acc': 0.625, 'step': 798},\n",
       "  {'loss': 0.8893064260482788, 'acc': 0.625, 'step': 799},\n",
       "  {'loss': 0.9282295107841492, 'acc': 0.703125, 'step': 800},\n",
       "  {'loss': 0.8360576033592224, 'acc': 0.71875, 'step': 801},\n",
       "  {'loss': 0.9708033800125122, 'acc': 0.59375, 'step': 802},\n",
       "  {'loss': 0.9044224619865417, 'acc': 0.6875, 'step': 803},\n",
       "  {'loss': 0.8826085925102234, 'acc': 0.6875, 'step': 804},\n",
       "  {'loss': 0.9903624057769775, 'acc': 0.65625, 'step': 805},\n",
       "  {'loss': 0.7604999542236328, 'acc': 0.6875, 'step': 806},\n",
       "  {'loss': 1.0288114547729492, 'acc': 0.59375, 'step': 807},\n",
       "  {'loss': 0.9133417010307312, 'acc': 0.640625, 'step': 808},\n",
       "  {'loss': 0.9959300756454468, 'acc': 0.640625, 'step': 809},\n",
       "  {'loss': 0.8174766302108765, 'acc': 0.734375, 'step': 810},\n",
       "  {'loss': 0.8405184149742126, 'acc': 0.78125, 'step': 811},\n",
       "  {'loss': 0.9231134057044983, 'acc': 0.625, 'step': 812},\n",
       "  {'loss': 0.9540446996688843, 'acc': 0.625, 'step': 813},\n",
       "  {'loss': 0.9594204425811768, 'acc': 0.703125, 'step': 814},\n",
       "  {'loss': 0.6925864219665527, 'acc': 0.734375, 'step': 815},\n",
       "  {'loss': 0.7754167318344116, 'acc': 0.71875, 'step': 816},\n",
       "  {'loss': 0.788068950176239, 'acc': 0.71875, 'step': 817},\n",
       "  {'loss': 0.8807824850082397, 'acc': 0.65625, 'step': 818},\n",
       "  {'loss': 0.9482259750366211, 'acc': 0.71875, 'step': 819},\n",
       "  {'loss': 0.941102921962738, 'acc': 0.625, 'step': 820},\n",
       "  {'loss': 0.9718624353408813, 'acc': 0.671875, 'step': 821},\n",
       "  {'loss': 0.8178977966308594, 'acc': 0.796875, 'step': 822},\n",
       "  {'loss': 0.9359808564186096, 'acc': 0.609375, 'step': 823},\n",
       "  {'loss': 0.9937902688980103, 'acc': 0.671875, 'step': 824},\n",
       "  {'loss': 0.8800021409988403, 'acc': 0.625, 'step': 825},\n",
       "  {'loss': 0.8489527702331543, 'acc': 0.671875, 'step': 826},\n",
       "  {'loss': 0.7412911653518677, 'acc': 0.765625, 'step': 827},\n",
       "  {'loss': 0.8875700235366821, 'acc': 0.625, 'step': 828},\n",
       "  {'loss': 0.9253054857254028, 'acc': 0.59375, 'step': 829},\n",
       "  {'loss': 0.9776363372802734, 'acc': 0.640625, 'step': 830},\n",
       "  {'loss': 0.8415868282318115, 'acc': 0.703125, 'step': 831},\n",
       "  {'loss': 0.8498031497001648, 'acc': 0.625, 'step': 832},\n",
       "  {'loss': 0.985342800617218, 'acc': 0.625, 'step': 833},\n",
       "  {'loss': 1.0059993267059326, 'acc': 0.640625, 'step': 834},\n",
       "  {'loss': 0.942195475101471, 'acc': 0.734375, 'step': 835},\n",
       "  {'loss': 0.7423872947692871, 'acc': 0.734375, 'step': 836},\n",
       "  {'loss': 0.9089778065681458, 'acc': 0.671875, 'step': 837},\n",
       "  {'loss': 0.820458173751831, 'acc': 0.6875, 'step': 838},\n",
       "  {'loss': 0.9289535284042358, 'acc': 0.640625, 'step': 839},\n",
       "  {'loss': 0.908837080001831, 'acc': 0.71875, 'step': 840},\n",
       "  {'loss': 0.9527611136436462, 'acc': 0.6875, 'step': 841},\n",
       "  {'loss': 0.8278713226318359, 'acc': 0.65625, 'step': 842},\n",
       "  {'loss': 0.798237144947052, 'acc': 0.734375, 'step': 843},\n",
       "  {'loss': 0.868848979473114, 'acc': 0.640625, 'step': 844},\n",
       "  {'loss': 0.9345693588256836, 'acc': 0.65625, 'step': 845},\n",
       "  {'loss': 0.760781466960907, 'acc': 0.6875, 'step': 846},\n",
       "  {'loss': 0.7714956998825073, 'acc': 0.703125, 'step': 847},\n",
       "  {'loss': 0.8114810585975647, 'acc': 0.734375, 'step': 848},\n",
       "  {'loss': 0.808549702167511, 'acc': 0.734375, 'step': 849},\n",
       "  {'loss': 0.7775453329086304, 'acc': 0.75, 'step': 850},\n",
       "  {'loss': 0.8980180025100708, 'acc': 0.703125, 'step': 851},\n",
       "  {'loss': 0.8024730682373047, 'acc': 0.65625, 'step': 852},\n",
       "  {'loss': 0.8472391963005066, 'acc': 0.6875, 'step': 853},\n",
       "  {'loss': 0.9116278886795044, 'acc': 0.75, 'step': 854},\n",
       "  {'loss': 0.8647763729095459, 'acc': 0.71875, 'step': 855},\n",
       "  {'loss': 0.8759254813194275, 'acc': 0.6875, 'step': 856},\n",
       "  {'loss': 0.9696173071861267, 'acc': 0.625, 'step': 857},\n",
       "  {'loss': 0.7745160460472107, 'acc': 0.765625, 'step': 858},\n",
       "  {'loss': 0.7588064670562744, 'acc': 0.71875, 'step': 859},\n",
       "  {'loss': 0.8105872869491577, 'acc': 0.78125, 'step': 860},\n",
       "  {'loss': 0.8463335633277893, 'acc': 0.671875, 'step': 861},\n",
       "  {'loss': 0.7622811198234558, 'acc': 0.78125, 'step': 862},\n",
       "  {'loss': 0.9957899451255798, 'acc': 0.625, 'step': 863},\n",
       "  {'loss': 0.877757728099823, 'acc': 0.640625, 'step': 864},\n",
       "  {'loss': 0.8473191261291504, 'acc': 0.671875, 'step': 865},\n",
       "  {'loss': 0.865592360496521, 'acc': 0.6875, 'step': 866},\n",
       "  {'loss': 0.7649982571601868, 'acc': 0.75, 'step': 867},\n",
       "  {'loss': 0.7612500786781311, 'acc': 0.734375, 'step': 868},\n",
       "  {'loss': 0.9843102097511292, 'acc': 0.71875, 'step': 869},\n",
       "  {'loss': 0.7255968451499939, 'acc': 0.734375, 'step': 870},\n",
       "  {'loss': 0.7152800559997559, 'acc': 0.78125, 'step': 871},\n",
       "  {'loss': 0.9531521797180176, 'acc': 0.59375, 'step': 872},\n",
       "  {'loss': 0.7487931251525879, 'acc': 0.796875, 'step': 873},\n",
       "  {'loss': 0.8738190531730652, 'acc': 0.640625, 'step': 874},\n",
       "  {'loss': 0.8050612807273865, 'acc': 0.671875, 'step': 875},\n",
       "  {'loss': 0.739661455154419, 'acc': 0.71875, 'step': 876},\n",
       "  {'loss': 0.8383027911186218, 'acc': 0.6875, 'step': 877},\n",
       "  {'loss': 0.8765237927436829, 'acc': 0.625, 'step': 878},\n",
       "  {'loss': 0.9395608305931091, 'acc': 0.65625, 'step': 879},\n",
       "  {'loss': 0.9431242346763611, 'acc': 0.6875, 'step': 880},\n",
       "  {'loss': 0.7595742344856262, 'acc': 0.75, 'step': 881},\n",
       "  {'loss': 0.8392260074615479, 'acc': 0.765625, 'step': 882},\n",
       "  {'loss': 0.7602487802505493, 'acc': 0.734375, 'step': 883},\n",
       "  {'loss': 0.9787810444831848, 'acc': 0.65625, 'step': 884},\n",
       "  {'loss': 0.8237674236297607, 'acc': 0.765625, 'step': 885},\n",
       "  {'loss': 0.892290472984314, 'acc': 0.625, 'step': 886},\n",
       "  {'loss': 0.7680854797363281, 'acc': 0.78125, 'step': 887},\n",
       "  {'loss': 0.8425833582878113, 'acc': 0.65625, 'step': 888},\n",
       "  {'loss': 0.7110280990600586, 'acc': 0.765625, 'step': 889},\n",
       "  {'loss': 0.7934913635253906, 'acc': 0.75, 'step': 890},\n",
       "  {'loss': 1.0124188661575317, 'acc': 0.71875, 'step': 891},\n",
       "  {'loss': 0.8769610524177551, 'acc': 0.65625, 'step': 892},\n",
       "  {'loss': 0.7509900331497192, 'acc': 0.734375, 'step': 893},\n",
       "  {'loss': 0.7517626881599426, 'acc': 0.765625, 'step': 894},\n",
       "  {'loss': 0.7590732574462891, 'acc': 0.6875, 'step': 895},\n",
       "  {'loss': 0.772723913192749, 'acc': 0.734375, 'step': 896},\n",
       "  {'loss': 0.9585692882537842, 'acc': 0.640625, 'step': 897},\n",
       "  {'loss': 0.979511022567749, 'acc': 0.625, 'step': 898},\n",
       "  {'loss': 0.8389408588409424, 'acc': 0.75, 'step': 899},\n",
       "  {'loss': 0.7937529683113098, 'acc': 0.71875, 'step': 900},\n",
       "  {'loss': 1.0076510906219482, 'acc': 0.703125, 'step': 901},\n",
       "  {'loss': 0.7759177684783936, 'acc': 0.78125, 'step': 902},\n",
       "  {'loss': 0.768449068069458, 'acc': 0.703125, 'step': 903},\n",
       "  {'loss': 0.8842533826828003, 'acc': 0.671875, 'step': 904},\n",
       "  {'loss': 0.9110180735588074, 'acc': 0.609375, 'step': 905},\n",
       "  {'loss': 0.7789989113807678, 'acc': 0.703125, 'step': 906},\n",
       "  {'loss': 0.8638507127761841, 'acc': 0.65625, 'step': 907},\n",
       "  {'loss': 0.838748574256897, 'acc': 0.734375, 'step': 908},\n",
       "  {'loss': 0.8917566537857056, 'acc': 0.6875, 'step': 909},\n",
       "  {'loss': 0.8187570571899414, 'acc': 0.734375, 'step': 910},\n",
       "  {'loss': 0.8127685785293579, 'acc': 0.65625, 'step': 911},\n",
       "  {'loss': 0.7413354516029358, 'acc': 0.71875, 'step': 912},\n",
       "  {'loss': 0.831230878829956, 'acc': 0.640625, 'step': 913},\n",
       "  {'loss': 0.8603538274765015, 'acc': 0.65625, 'step': 914},\n",
       "  {'loss': 0.8178998231887817, 'acc': 0.65625, 'step': 915},\n",
       "  {'loss': 0.8427044153213501, 'acc': 0.703125, 'step': 916},\n",
       "  {'loss': 0.7627020478248596, 'acc': 0.703125, 'step': 917},\n",
       "  {'loss': 0.8317338824272156, 'acc': 0.765625, 'step': 918},\n",
       "  {'loss': 0.8318576812744141, 'acc': 0.734375, 'step': 919},\n",
       "  {'loss': 0.6925638914108276, 'acc': 0.765625, 'step': 920},\n",
       "  {'loss': 0.8621690273284912, 'acc': 0.640625, 'step': 921},\n",
       "  {'loss': 0.9529182314872742, 'acc': 0.65625, 'step': 922},\n",
       "  {'loss': 0.8518168330192566, 'acc': 0.609375, 'step': 923},\n",
       "  {'loss': 0.8428389430046082, 'acc': 0.671875, 'step': 924},\n",
       "  {'loss': 0.9057179093360901, 'acc': 0.640625, 'step': 925},\n",
       "  {'loss': 0.8638969659805298, 'acc': 0.640625, 'step': 926},\n",
       "  {'loss': 0.9543195962905884, 'acc': 0.578125, 'step': 927},\n",
       "  {'loss': 0.802851140499115, 'acc': 0.71875, 'step': 928},\n",
       "  {'loss': 0.9479233026504517, 'acc': 0.703125, 'step': 929},\n",
       "  {'loss': 0.8446574211120605, 'acc': 0.6875, 'step': 930},\n",
       "  {'loss': 0.9077442288398743, 'acc': 0.625, 'step': 931},\n",
       "  {'loss': 0.9175500869750977, 'acc': 0.578125, 'step': 932},\n",
       "  {'loss': 0.793630838394165, 'acc': 0.6875, 'step': 933},\n",
       "  {'loss': 0.7918208241462708, 'acc': 0.71875, 'step': 934},\n",
       "  {'loss': 0.6694223284721375, 'acc': 0.8125, 'step': 935},\n",
       "  {'loss': 0.8726739287376404, 'acc': 0.6875, 'step': 936},\n",
       "  {'loss': 0.8600301146507263, 'acc': 0.78125, 'step': 937},\n",
       "  {'loss': 0.8393349051475525, 'acc': 0.65625, 'step': 938},\n",
       "  {'loss': 0.7049909234046936, 'acc': 0.765625, 'step': 939},\n",
       "  {'loss': 0.7253676056861877, 'acc': 0.78125, 'step': 940},\n",
       "  {'loss': 0.6370625495910645, 'acc': 0.796875, 'step': 941},\n",
       "  {'loss': 0.8312251567840576, 'acc': 0.671875, 'step': 942},\n",
       "  {'loss': 0.7370740175247192, 'acc': 0.703125, 'step': 943},\n",
       "  {'loss': 0.7269875407218933, 'acc': 0.78125, 'step': 944},\n",
       "  {'loss': 0.8280295729637146, 'acc': 0.75, 'step': 945},\n",
       "  {'loss': 0.8264626264572144, 'acc': 0.703125, 'step': 946},\n",
       "  {'loss': 0.906937837600708, 'acc': 0.609375, 'step': 947},\n",
       "  {'loss': 0.8339377641677856, 'acc': 0.734375, 'step': 948},\n",
       "  {'loss': 0.7629102468490601, 'acc': 0.75, 'step': 949},\n",
       "  {'loss': 0.8440561294555664, 'acc': 0.640625, 'step': 950},\n",
       "  {'loss': 0.7782737612724304, 'acc': 0.671875, 'step': 951},\n",
       "  {'loss': 0.9342650175094604, 'acc': 0.765625, 'step': 952},\n",
       "  {'loss': 0.7562246322631836, 'acc': 0.703125, 'step': 953},\n",
       "  {'loss': 0.8843258619308472, 'acc': 0.640625, 'step': 954},\n",
       "  {'loss': 0.7166857719421387, 'acc': 0.734375, 'step': 955},\n",
       "  {'loss': 0.7464150786399841, 'acc': 0.734375, 'step': 956},\n",
       "  {'loss': 0.7927057147026062, 'acc': 0.671875, 'step': 957},\n",
       "  {'loss': 0.9001950621604919, 'acc': 0.65625, 'step': 958},\n",
       "  {'loss': 0.7512662410736084, 'acc': 0.65625, 'step': 959},\n",
       "  {'loss': 0.770112931728363, 'acc': 0.75, 'step': 960},\n",
       "  {'loss': 0.747468113899231, 'acc': 0.703125, 'step': 961},\n",
       "  {'loss': 0.8247861862182617, 'acc': 0.671875, 'step': 962},\n",
       "  {'loss': 0.8939240574836731, 'acc': 0.6875, 'step': 963},\n",
       "  {'loss': 0.776130199432373, 'acc': 0.671875, 'step': 964},\n",
       "  {'loss': 0.774800717830658, 'acc': 0.703125, 'step': 965},\n",
       "  {'loss': 0.7673628330230713, 'acc': 0.71875, 'step': 966},\n",
       "  {'loss': 0.7741358280181885, 'acc': 0.78125, 'step': 967},\n",
       "  {'loss': 0.8567361831665039, 'acc': 0.71875, 'step': 968},\n",
       "  {'loss': 0.8886336088180542, 'acc': 0.640625, 'step': 969},\n",
       "  {'loss': 0.81385737657547, 'acc': 0.640625, 'step': 970},\n",
       "  {'loss': 0.9463220238685608, 'acc': 0.6875, 'step': 971},\n",
       "  {'loss': 0.8746039867401123, 'acc': 0.703125, 'step': 972},\n",
       "  {'loss': 0.9255685210227966, 'acc': 0.625, 'step': 973},\n",
       "  {'loss': 0.7997058629989624, 'acc': 0.6875, 'step': 974},\n",
       "  {'loss': 0.8428574204444885, 'acc': 0.671875, 'step': 975},\n",
       "  {'loss': 0.8302751779556274, 'acc': 0.734375, 'step': 976},\n",
       "  {'loss': 0.661264181137085, 'acc': 0.828125, 'step': 977},\n",
       "  {'loss': 0.6603996157646179, 'acc': 0.796875, 'step': 978},\n",
       "  {'loss': 0.9440001845359802, 'acc': 0.609375, 'step': 979},\n",
       "  {'loss': 0.6777300238609314, 'acc': 0.765625, 'step': 980},\n",
       "  {'loss': 0.8218613862991333, 'acc': 0.75, 'step': 981},\n",
       "  {'loss': 0.7109417915344238, 'acc': 0.734375, 'step': 982},\n",
       "  {'loss': 0.8346090912818909, 'acc': 0.640625, 'step': 983},\n",
       "  {'loss': 0.780655026435852, 'acc': 0.71875, 'step': 984},\n",
       "  {'loss': 0.9248800277709961, 'acc': 0.609375, 'step': 985},\n",
       "  {'loss': 0.7264230251312256, 'acc': 0.765625, 'step': 986},\n",
       "  {'loss': 0.9179493188858032, 'acc': 0.671875, 'step': 987},\n",
       "  {'loss': 0.8318325877189636, 'acc': 0.65625, 'step': 988},\n",
       "  {'loss': 0.7660835981369019, 'acc': 0.71875, 'step': 989},\n",
       "  {'loss': 0.740283727645874, 'acc': 0.671875, 'step': 990},\n",
       "  {'loss': 0.8461599349975586, 'acc': 0.71875, 'step': 991},\n",
       "  {'loss': 0.8737347722053528, 'acc': 0.71875, 'step': 992},\n",
       "  {'loss': 0.7133488655090332, 'acc': 0.765625, 'step': 993},\n",
       "  {'loss': 0.808983325958252, 'acc': 0.65625, 'step': 994},\n",
       "  {'loss': 0.7235084176063538, 'acc': 0.75, 'step': 995},\n",
       "  {'loss': 0.7502807974815369, 'acc': 0.6875, 'step': 996},\n",
       "  {'loss': 0.8731695413589478, 'acc': 0.75, 'step': 997},\n",
       "  {'loss': 0.7025159597396851, 'acc': 0.71875, 'step': 998},\n",
       "  {'loss': 0.749565064907074, 'acc': 0.71875, 'step': 999},\n",
       "  ...],\n",
       " 'val': [{'loss': np.float64(2.303283551696), 'acc': 0.0657, 'step': 0},\n",
       "  {'loss': np.float64(0.8097402874831181), 'acc': 0.6898, 'step': 1000},\n",
       "  {'loss': np.float64(0.6312109693220467), 'acc': 0.7752, 'step': 2000},\n",
       "  {'loss': np.float64(0.5618587906952877), 'acc': 0.7989, 'step': 3000},\n",
       "  {'loss': np.float64(0.5353189427761516), 'acc': 0.8066, 'step': 4000},\n",
       "  {'loss': np.float64(0.5028771245555513), 'acc': 0.8212, 'step': 5000},\n",
       "  {'loss': np.float64(0.5011222400483052), 'acc': 0.823, 'step': 6000},\n",
       "  {'loss': np.float64(0.4762339035796512), 'acc': 0.8317, 'step': 7000},\n",
       "  {'loss': np.float64(0.46099752206711253), 'acc': 0.8368, 'step': 8000},\n",
       "  {'loss': np.float64(0.4580227504869935), 'acc': 0.8376, 'step': 9000},\n",
       "  {'loss': np.float64(0.4504877870819371), 'acc': 0.8394, 'step': 10000},\n",
       "  {'loss': np.float64(0.4521555209615428), 'acc': 0.8356, 'step': 11000},\n",
       "  {'loss': np.float64(0.4397649941550698), 'acc': 0.8461, 'step': 12000},\n",
       "  {'loss': np.float64(0.4254362663835477), 'acc': 0.849, 'step': 13000},\n",
       "  {'loss': np.float64(0.4257226530343864), 'acc': 0.8508, 'step': 14000},\n",
       "  {'loss': np.float64(0.414685644161929), 'acc': 0.8542, 'step': 15000},\n",
       "  {'loss': np.float64(0.412736831482049), 'acc': 0.8549, 'step': 16000},\n",
       "  {'loss': np.float64(0.4094392850900152), 'acc': 0.8563, 'step': 17000},\n",
       "  {'loss': np.float64(0.40763905008507384), 'acc': 0.8582, 'step': 18000},\n",
       "  {'loss': np.float64(0.3958960540924862), 'acc': 0.8597, 'step': 19000},\n",
       "  {'loss': np.float64(0.39207714729627985), 'acc': 0.8616, 'step': 20000},\n",
       "  {'loss': np.float64(0.3914279361629182), 'acc': 0.8628, 'step': 21000},\n",
       "  {'loss': np.float64(0.38663852300233903), 'acc': 0.8641, 'step': 22000},\n",
       "  {'loss': np.float64(0.38776573216079907), 'acc': 0.8653, 'step': 23000},\n",
       "  {'loss': np.float64(0.3802571514040042), 'acc': 0.8661, 'step': 24000},\n",
       "  {'loss': np.float64(0.38244911439859186), 'acc': 0.8629, 'step': 25000},\n",
       "  {'loss': np.float64(0.37936009286315575), 'acc': 0.8633, 'step': 26000},\n",
       "  {'loss': np.float64(0.3729196185139334), 'acc': 0.8679, 'step': 27000},\n",
       "  {'loss': np.float64(0.3687491511843007), 'acc': 0.8673, 'step': 28000},\n",
       "  {'loss': np.float64(0.3707874177178), 'acc': 0.8659, 'step': 29000},\n",
       "  {'loss': np.float64(0.3652360799965585), 'acc': 0.872, 'step': 30000},\n",
       "  {'loss': np.float64(0.36016577852379744), 'acc': 0.8738, 'step': 31000},\n",
       "  {'loss': np.float64(0.3681142938554667), 'acc': 0.8676, 'step': 32000},\n",
       "  {'loss': np.float64(0.3574060084903316), 'acc': 0.8748, 'step': 33000},\n",
       "  {'loss': np.float64(0.35433743191752465), 'acc': 0.8753, 'step': 34000},\n",
       "  {'loss': np.float64(0.3558664101703911), 'acc': 0.8723, 'step': 35000},\n",
       "  {'loss': np.float64(0.3519177617161137), 'acc': 0.8756, 'step': 36000},\n",
       "  {'loss': np.float64(0.3551468471432947), 'acc': 0.8748, 'step': 37000}]}"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:47:30.370779Z",
     "start_time": "2025-03-05T13:47:30.274362Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    # print(train_df.head())\n",
    "    # print(val_df.head())\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) #因为有loss和acc两个指标，所以画个子图\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5)) #fig_num个子图，figsize是子图大小\n",
    "    for idx, item in enumerate(train_df.columns):    \n",
    "        #index是步数，item是指标名字\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        x_data=range(0, train_df.index[-1], 5000) #每隔5000步标出一个点\n",
    "        axs[idx].set_xticks(x_data)\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", x_data)) #map生成labal\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record, sample_step=500)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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JE+CObdpC/wjArPmZEJaFB8fLfFVb/w17wEUnERHP0DWKzp629rkYTFEWTs+zEps1YIn63P6h/9AgtI6O01OD0aDwnAZLX1W/icTEiIH/voc6GGic/fdd/P+++/z+eefM2LEiE7vm5aWRklJSYvrSkpKSEtL6/Axq1evbtHuVltbS0ZGBsuWLSMm5uxz7VsrrKznjf3vATB6eCoj+3HiW3c5nU42bNjA0qVLMZsHdklwMMUKgyteibVvDKZYYWDEq1fUxeD3waFinG6VyekxXUtyXHb47Lew5WkMqpsWO7IoRm3imW/yWSLEDIMp18CIeb2q3rRngncRuf9YYF3zMIXuHx8Egl4JK6+3U293+Y2V7jxxab2+obcbhYqu0QcSZJfUketdVzU8LjwgY72HOv9EZzAMIoBuJjqqqvKDH/yAt99+m02bNjF69OizPmbhwoVs3LiRe++913fdhg0bWLhwYYePsVqtWK1tFziZzeYevdmHh1map6657YPiAKenrzUYBlOsMLjilVj7xmCKFYIb72D6PonO6W1rV84cdvY7F+yBd+/SxjIDnklXsdU1la9ccgXmmDQIiwND/x0Y+vbwKK7D41F9LTNOt4eTpfUt7tPfYsPNJERaqGxwkFfRwM7cro2KDrcYibQYaXC4GREXRnqsVBT6w7jUKAwKVDY42OUd6y2jpbtGHwwCbSuSA1W3/krddddd/POf/+SVV14hOjqa4uJiiouLaWxs3pvmlltuYfXq1b7P77nnHj788EOefPJJsrKyePDBB9m1axd333134F7FWZiNBl+iozplHx0hhBChpaimkS9ztErDyhmdJDouO2x8GJ5foiU5EUlw3T9wf/VvVEZN0IYKRCT0a5IDMDopErNRocHhpqC6+X08t7wBh9tDpMUY1NYj/UD5UEENWcVaFbQrFZpE71nxwbbx5mAWZjb62g3XH9bWi8v6nK6JspoYEa/9PxssFZ1u/aX685//TE1NDRdeeCHp6em+y2uvvea7T35+PkVFRb7PFy1axCuvvMJf//pXZsyYwRtvvME777zTb3voAJgNiiQ6QgghQtb7+4tQVZifmdBxQlCwB/5yAWx+ElQ3TPkq3PWlNlAgyMxGA2OSteY5//a19Ue01vjxadFBXRitHyi/vbcAjwojEyJIjQk76+NSvAMJ5oyK68vwRCt6C9b+M9r0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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 43
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "model = NeuralNetwork() #上线时加载模型\n",
    "model = model.to(device)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T13:41:37.275049Z",
     "start_time": "2025-03-05T13:41:37.268035Z"
    }
   },
   "outputs": [],
   "execution_count": 41
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T13:41:38.842465Z",
     "start_time": "2025-03-05T13:41:37.275922Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "#模型保存有两种情况，一种是模型结构和模型参数都保存，一种是只保存模型参数，这里是只保存模型参数，所以需要加上weights_only=True\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/best.ckpt\", weights_only=True,map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3519\n",
      "accuracy: 0.8756\n"
     ]
    }
   ],
   "execution_count": 42
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
